如何在 SQL Server 中为多列使用 HASHBYTES 函数

Vik*_*s J 8 sql-server

我有一个要求,其中我必须创建由表的所有列组成的哈希值。有了Checksum这个很容易做到,但Checksum不推荐,因为每微软:

如果表达式列表中的至少一个值发生变化,则列表校验和可能会发生变化。但是,这并不能保证。因此,要检测值是否已更改,我们建议仅在您的应用程序可以容忍偶尔遗漏更改时才使用 CHECKSUM。否则,请考虑改用 HashBytes。使用指定的 MD5 哈希算法,与 CHECKSUM 相比,对于两个不同的输入,HashBytes 返回相同结果的概率要低得多。

HASHBYTES 只接受 2 个参数(算法类型,列)

现在的问题是即使HASHBYTES与校验和相比更可靠,但似乎没有一种简单的方法可以在多列上创建它。

校验和中的一个例子,

create table dbo.chksum_demo1
(
    id int not null,
    name varchar(25),
    address varchar(250),
    HashValue as Checksum (id,name,address)
    CONSTRAINT PK_chksum_demo1 PRIMARY KEY (Id)
)
Run Code Online (Sandbox Code Playgroud)

我们如何使用Hashbytes而不是校验和来完成上述操作?

小智 11

用这个:

SELECT *,    
HASHBYTES('MD5', (SELECT ID, name, address FOR XML RAW))
FROM Table1
Run Code Online (Sandbox Code Playgroud)


Bri*_*ian 8

一种方法是concat()将字段与分隔符一起使用。对于任何日期,手动将它们格式化为字符串以控制格式。

 HashValue as HASHBYTES('SHA2_256', CONCAT(ID,'|',name,'|',address)) 
Run Code Online (Sandbox Code Playgroud)

处理空字段需要分隔符,因此 ID:1 Name:'' Address:'12' 与 ID:1 Name:'12' Address:'' 不同。


Ole*_*leg 7

SELECT HASHBYTES('<algorithm>', CONCAT_WS('|', f1, f2, f3, f4 ...))
FROM Table1
Run Code Online (Sandbox Code Playgroud)

算法>::= MD2 | MD4 | MD5 | 沙| SHA1 | SHA2_256 | SHA2_512