sql >> Database >  >> RDS >> Sqlserver

Dynamische SQL met lus over alle kolommen in een tabel

Hier is een voorbeeld waarin alle suggesties in de opmerkingen worden verwerkt.

declare @sql nvarchar(max);
declare stat_cursor cursor local fast_forward for
select
    case when x.name not in ('date', 'datetime2', 'smalldatetime', 'datetime') then

N'select
    ' + quotename(s.name, '''') + ' as schema_name,
    ' + quotename(t.name, '''') + ' as table_name,
    ' + quotename(c.name) + ' as column_name,
    count(*) qty
from
    ' + quotename(s.name) + '.' + quotename(t.name) + '
group by 
    ' + quotename(c.name) + '
order by 
    qty desc;'

    else

N'select
    ' + quotename(s.name, '''') + ' as schema_name,
    ' + quotename(t.name, '''') + ' as table_name,
    year(' + quotename(c.name) + ') as column_name,
    count(*) qty
from
    ' + quotename(s.name) + '.' + quotename(t.name) + '
group by 
    year(' + quotename(c.name) + ')
order by 
    qty desc;'

    end

from
    sys.schemas s
        inner join
    sys.tables t
        on s.schema_id = t.schema_id
        inner join
    sys.columns c
        on c.object_id = t.object_id
        inner join
    sys.types x
        on c.system_type_id = x.user_type_id
where
    x.name not in (
        'geometry',
        'geography',
        'hierarchyid',
        'xml',
        'timestamp',
        'bit',
        'image',
        'text',
        'ntext'
    );

open stat_cursor;

fetch next from stat_cursor into @sql;

while @@fetch_status = 0
begin
    exec sp_executesql @sql;
    fetch next from stat_cursor into @sql;
end;

close stat_cursor;
deallocate stat_cursor;

Voorbeeld SQLFiddle (merk op dat dit alleen de eerste iteratie door de cursor laat zien. Ik weet niet zeker of dit een beperking van SQLFiddle of een bug is).

Ik zou de resultaten waarschijnlijk in een aparte database opslaan als ik dit zou doen. Ook zou ik waarschijnlijk de SQL-bouwbits in door de gebruiker gedefinieerde functies plaatsen voor onderhoudbaarheid (het langzame bit zal de query's uitvoeren, het heeft geen zin om ze te optimaliseren).




  1. Als ik de aanmaakmethode van Waterline gebruik, wordt de ID van het nieuwe record niet geretourneerd

  2. Hoe kan ik gebruik maken van een .db-bestand in SQL server 2008?

  3. Entity Framework C# Gegevens invoegen Russische coderingsproblemen

  4. Oude stijl Oracle Outer Join-syntaxis - Waarom de (+) aan de rechterkant van het isgelijkteken plaatsen in een Left Outer join?