Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL dinâmico com loop em todas as colunas em uma tabela


Aqui está um exemplo trabalhando com todas as sugestões nos comentários.
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;

Exemplo SQLFiddle (observe que isso mostra apenas a primeira iteração através do cursor. Não tenho certeza se isso é uma limitação do SQLFiddle ou um bug).

Eu provavelmente esconderia os resultados em um banco de dados separado se estivesse fazendo isso. Além disso, eu provavelmente colocaria os bits de construção do SQL em funções definidas pelo usuário para manutenção (o bit lento estará executando as consultas, não faz sentido otimizar gerá-las).