sql >> Databasteknik >  >> RDS >> Sqlserver

Dynamisk SQL med loop över alla kolumner i en tabell

Här är ett exempel som går igenom alla förslag i kommentarerna.

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;

Exempel SQLFiddle (observera att detta endast visar den första iterationen genom markören. Osäker på om detta är en begränsning av SQLFiddle eller en bugg).

Jag skulle förmodligen lagra resultaten i en separat databas om jag gjorde det här. Dessutom skulle jag förmodligen lägga SQL-byggnadsbitarna i användardefinierade funktioner för underhåll (den långsamma biten kommer att köra frågorna, ingen idé att optimera att generera dem).




  1. Att hitta summa och gruppera i fortsättning

  2. Hur man konfigurerar PostgreSQL Sharding med ClusterControl

  3. Nätverksadaptern kunde inte upprätta anslutningen - Oracle 11g

  4. MySql-tabell till JSON-format