Här är ett exempel som går igenom alla förslag i kommentarerna.
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;
Exempel SQLFiddle (observera att detta endast visar den första iterationen genom markören. Osäker på om detta är en begränsning av SQLFiddle eller en bugg).
Jag skulle förmodligen lagra resultaten i en separat databas om jag gjorde det här. Dessutom skulle jag förmodligen lägga SQL-byggnadsbitarna i användardefinierade funktioner för underhåll (den långsamma biten kommer att köra frågorna, ingen idé att optimera att generera dem).