BINARY_CHECKSUM (Transact-SQL)

适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Microsoft Fabric 中的 SQL 分析终结点 Microsoft Fabric 中的仓库

返回按照表的某一行或表达式列表计算的二进制校验和值。

Transact-SQL 语法约定

语法

BINARY_CHECKSUM ( * | expression [ ,...n ] )   

注意

Azure Synapse Analytics 中的无服务器 SQL 池不支持此语法。

参数

*
指定计算涵盖所有表列。 BINARY_CHECKSUM 在计算中忽略具有不可比数据类型的列。 非可比数据类型包括

  • cursor
  • 图像
  • ntext
  • text
  • xml

与非可比公共语言运行时 (CLR) 用户定义类型。

expression
任何类型的表达式。 BINARY_CHECKSUM 在计算中忽略具有不可比数据类型的表达式。

返回类型

int

备注

按照表中任一行计算的 BINARY_CHECKSUM(*) 返回相同的值,前提是后续没有对行进行修改。 BINARY_CHECKSUM 满足哈希函数的下列属性:在使用等于 (=) 运算符比较时,如果两个列表的相应元素类型相同且相等,则在任何两个表达式列表上应用的 BINARY CHECKSUM 将返回相同值。 对于该定义,我们认为指定类型的 NULL 值作为相等的值进行比较。 如果表达式列表中至少一个值发生更改,则表达式校验和也会更改。 但是,不保证此更改,因此若要检测值是否更改,建议仅当应用程序可以容忍偶然错过更改时,使用 BINARY_CHECKSUM。 否则,请考虑改用 HASHBYTES。 使用指定的 MD5 哈希算法时,HASHBYTES 为两个不同输入返回相同结果的可能性要比 BINARY_CHECKSUM 小得多。

BINARY_CHECKSUM 可针对表达式列表运行,并为指定列表返回相同的值。 如果任意两个表达式列表的对应元素具有相同的类型和字节表示形式,则对这两个列表应用的 BINARY_CHECKSUM 将返回相同的值。 对于此定义,指定类型的 Null 值被认为具有相同的字节表示形式。

BINARY_CHECKSUM 函数和 CHECKSUM 函数类似。 它们可用于计算表达式列表上的校验值,且表达式的顺序将影响结果值。 用于 BINARY_CHECKSUM(*) 的列顺序是在表或视图定义中指定的列顺序。 此排序包括计算列。

BINARY_CHECKSUMCHECKSUM 为字符串数据类型将返回不同的值,其中的区域设置可能导致具有不同表示形式的字符串进行等值比较。 字符串数据类型为

  • char
  • nchar
  • nvarchar
  • varchar

or

  • sql_variant(如果 sql_variant 的基类型为字符串数据类型)

例如,字符串“McCavity”和“Mccavity”的 BINARY_CHECKSUM 值不同。 反之,对于不区分大小写的服务器,上述字符串的 CHECKSUM 将返回相同的校验和值。 应避免比较 CHECKSUM 值与 BINARY_CHECKSUM 值。

BINARY_CHECKSUM 支持任何字符长度的 varbinary(max) 类型和最多 255 个字符长度的 nvarchar(max) 类型。

示例

此示例使用 BINARY_CHECKSUM 检测表行中的更改。

USE AdventureWorks2022;  
GO  
CREATE TABLE myTable (column1 INT, column2 VARCHAR(256));  
GO  
INSERT INTO myTable VALUES (1, 'test');  
GO  
SELECT BINARY_CHECKSUM(*) from myTable;  
GO  
UPDATE myTable set column2 = 'TEST';  
GO  
SELECT BINARY_CHECKSUM(*) from myTable;  
GO  

另请参阅

聚合函数 (Transact-SQL)
CHECKSUM_AGG (Transact-SQL)
CHECKSUM (Transact-SQL)
HASHBYTES (Transact-SQL)