我有一个要求,其中我必须创建由表的所有列组成的哈希值。有了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)
一种方法是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:'' 不同。
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
| 归档时间: |
|
| 查看次数: |
16264 次 |
| 最近记录: |