BINARY_CHECKSUM(Transact-SQL)

适用于:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsMicrosoft Fabric 中的SQL分析端点Microsoft Fabric中的仓库Microsoft Fabric中的SQL数据库

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

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 满足哈希函数的性质:当应用到任意两个表达式列表时,如果两个列表对应元素类型相同且使用等=值()比较时相等,则返回相同的值。

对于该定义,我们认为指定类型的 NULL 值作为相等的值进行比较。 如果表达式列表中至少一个值发生更改,则表达式校验和也会更改。 然而,这种变化并非必然,因此要检测值是否发生变化,应仅在应用能容忍偶尔漏动的情况下使用 BINARY_CHECKSUM 。 否则,请考虑改用 HASHBYTES。 使用指定的MD5哈希算法,两个不同输入返回相同结果的概 HASHBYTES 率远低于 BINARY_CHECKSUM

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

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

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

  • char
  • nchar
  • nvarchar
  • varchar
  • sql_variant (如果 sql_variant 的基础类型是字符串数据类型)

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

BINARY_CHECKSUM 支持任意长度的 变数(max)类型,以及最多255个类型 nvarchar(n / 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