Đây là một ví dụ làm việc thông qua tất cả các đề xuất trong nhận xét.
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;
SQLFiddle mẫu (lưu ý điều này chỉ hiển thị lần lặp đầu tiên thông qua con trỏ. Không chắc đây là hạn chế của SQLFiddle hay lỗi).
Tôi có thể sẽ lưu trữ các kết quả vào một cơ sở dữ liệu riêng biệt nếu tôi đang làm điều này. Ngoài ra, tôi có thể sẽ đặt các bit xây dựng SQL vào các hàm do người dùng xác định để có thể bảo trì (bit chậm sẽ chạy các truy vấn, không có điểm nào tối ưu hóa việc tạo ra chúng).