T-SQL 선택 컬렉션 데이터베이스에 있는 모든 테이블과 각 테이블의 체크섬 목록(바이너리 체크섬 (*)

질문:

집합 데이터베이스에 있는 모든 표를 열거하고 각 표를 열거해야 한다CHECKSUM_AGG(BINARY_CHECKSUM(*)).
나는 내가 sp_tables로 모든 표를 열거할 수 있다는 것을 알고 있지만, 어떻게 그것을 CHECKSUM_AGG(BINARY_CHECKSUM(*))와 함께 끝의 추가 열로 사용할 수 있습니까?

답안

가능할 것 같지만 테이블이 많은 대형 데이터베이스에서 얼마나 오래 걸릴지 모릅니다.
if object_id('tempdb..#Tables') is not null
drop table #Tables;

select row_number() over (order by (select null)) as RowNum
        ,t.table_catalog as TableQualifier
        ,t.table_schema as TableOwner
        ,t.table_name as TableName
        ,case t.table_type
            when 'base table'
                then 'table'
            else t.table_type
        end as TableType
        ,null as TableChecksum
into #Tables
from information_schema.tables t
where t.table_type <> 'view';

declare @RowNum int;
declare @TableName nvarchar(100);
declare @TableChecksum bigint;
declare @SQL nvarchar(max);

while (select count(1) from #Tables where TableChecksum is null) > 0
begin
    select top 1 @RowNum = RowNum
                ,@TableName = TableName
                ,@SQL = 'select @TableChecksum = checksum_agg(binary_checksum(*)) from ' + @TableName
    from #Tables
    where TableChecksum is null;

    exec sp_executesql @SQL
                        ,N'@TableChecksum bigint output'
                        ,@TableChecksum output;

    update #Tables
    set TableChecksum = @TableChecksum 
    where RowNum = @RowNum;
end;

select *
from #Tables;

if object_id('tempdb..#Tables') is not null
drop table #Tables;