Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Dynamisches SQL mit Schleife über alle Spalten in einer Tabelle

Hier ist ein Beispiel, wie alle Vorschläge in den Kommentaren durchgearbeitet werden.

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;

Beispiel SQLFiddle (Beachten Sie, dass dies nur die erste Iteration durch den Cursor zeigt. Nicht sicher, ob dies eine Einschränkung von SQLFiddle oder ein Fehler ist).

Ich würde die Ergebnisse wahrscheinlich in einer separaten Datenbank speichern, wenn ich dies tun würde. Außerdem würde ich wahrscheinlich die SQL-Building-Bits in benutzerdefinierte Funktionen für die Wartbarkeit stecken (das langsame Bit wird die Abfragen ausführen, es hat keinen Sinn, sie zu optimieren).