计算SQL Server中的表的哈希或校验和

Gab*_*own 27 sql-server hash checksum sql-server-2008

我正在尝试为SQL Server 2008中的整个表计算校验和或散列.我遇到的问题是该表包含XML列数据类型,不能由校验和使用,必须转换为nvarchar第一.所以我需要将其分解为两个问题:

  1. 计算一行的校验和,架构在运行时之前是未知的.
  2. 计算所有行的校验和以获得完整的表校验和.

Cad*_*oux 23

您可以使用CHECKSUM_AGG.它只需要一个参数,所以你可以这样做CHECKSUM_AGG(CHECKSUM(*))- 但是这对你的XML数据类型不起作用,所以你不得不求助于动态SQL.

您可以动态生成列列表INFORMATION_SCHEMA.COLUMNS,然后将int插入到模板中:

SELECT @column_list = COALESCE(@column_list + ', ', '')
        + /* Put your casting here from XML, text, etc columns */ QUOTENAME(COLUMN_NAME)
FROM    INFORMATION_SCHEMA.COLUMNS
WHERE   TABLE_NAME = @table_name
    AND TABLE_SCHEMA = @schema_name

DECLARE @template AS varchar(MAX)
SET @template = 'SELECT CHECKSUM_AGG(CHECKSUM({@column_list})) FROM {@schema_name}.{@table_name}'

DECLARE @sql AS varchar(MAX)
SET @sql = REPLACE(REPLACE(REPLACE(@template
    '{@column_list}', @column_list),
    '{@schema_name}', @schema_name),
    '{@table_name}', @table_name)

EXEC ( @sql )
Run Code Online (Sandbox Code Playgroud)