Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL dynamique avec boucle sur toutes les colonnes d'une table

Voici un exemple d'analyse de toutes les suggestions dans les commentaires.

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;

Exemple SQLFiddle (notez que cela ne montre que la première itération à travers le curseur. Je ne sais pas s'il s'agit d'une limitation de SQLFiddle ou d'un bogue).

Je stockerais probablement les résultats dans une base de données séparée si je faisais cela. De plus, je mettrais probablement les bits de construction SQL dans des fonctions définies par l'utilisateur pour la maintenabilité (le bit lent exécutera les requêtes, inutile d'optimiser leur génération).