sql >> Databáze >  >> RDS >> Sqlserver

Dynamické SQL s opakováním všech sloupců v tabulce

Zde je příklad procházející všemi návrhy v komentářích.

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;

Příklad SQLFiddle (Všimněte si, že toto zobrazuje pouze první iteraci kurzorem. Nejsem si jistý, zda se jedná o omezení SQLFiddle nebo chybu).

Pokud bych to dělal, pravděpodobně bych výsledky schoval do samostatné databáze. Také bych pravděpodobně vložil bity pro vytváření SQL do uživatelsky definovaných funkcí kvůli údržbě (pomalý bit bude spouštět dotazy, nemá smysl je optimalizovat).




  1. Zaznamenejte změny záznamu na serveru SQL do auditní tabulky

  2. Jak nakonfigurovat loď člena s jinou databází než aspnetdb

  3. Relace serveru ORACLE byla ukončena závažnou chybou

  4. Jak mohu odstranit duplicitní řádky?