sql >> Database teknologi >  >> RDS >> Sqlserver

Dynamisk SQL med sløjfe over alle kolonner i en tabel

Her er et eksempel, der gennemgår alle forslagene i kommentarerne.

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;

Eksempel SQLFiddle (bemærk, at dette kun viser den første iteration gennem markøren. Ikke sikker på, om dette er en begrænsning af SQLFiddle eller en fejl).

Jeg ville sandsynligvis gemme resultaterne i en separat database, hvis jeg gjorde dette. Desuden ville jeg sandsynligvis sætte SQL-bygningsbittene ind i brugerdefinerede funktioner for vedligeholdelse (den langsomme bit vil køre forespørgslerne, uden nogen mening at optimere at generere dem).




  1. INSERT ... SELECT, InnoDB og låsning

  2. Tilføjelse af en ikke-nullbar kolonne til eksisterende tabel mislykkes. Bliver værdiegenskaben ignoreret?

  3. Mysql2::Fejl:Du har en fejl i din SQL-syntaks

  4. fjern dubletter fra komma eller pipeline-operatørstreng