Berikut ini contoh mengerjakan semua saran di komentar.
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;
Contoh SQLFiddle (perhatikan ini hanya menunjukkan iterasi pertama melalui kursor. Tidak yakin apakah ini batasan SQLFiddle atau bug).
Saya mungkin akan menyimpan hasilnya ke dalam database terpisah jika saya melakukan ini. Juga, saya mungkin akan menempatkan bit bangunan SQL ke dalam fungsi yang ditentukan pengguna untuk pemeliharaan (bit lambat akan menjalankan kueri, tidak ada gunanya mengoptimalkan pembuatannya).