Ecco un esempio che analizza tutti i suggerimenti nei commenti.
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;
Esempio SQLFiddle (nota che questo mostra solo la prima iterazione attraverso il cursore. Non sono sicuro se questa sia una limitazione di SQLFiddle o un bug).
Probabilmente conserverei i risultati in un database separato se lo stessi facendo. Inoltre, probabilmente inserirei i bit di costruzione SQL nelle funzioni definite dall'utente per la manutenibilità (il bit lento eseguirà le query, non ha senso ottimizzarle per generarle).