我有一个要求,我必须创建由表的所有列组成的哈希值。使用Checksum
可以轻松完成,但是根据Microsoft的建议,不建议使用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)
)
我们如何使用Hashbytes
而不是校验和来完成上述操作?
答案 0 :(得分:2)
SELECT HASHBYTES('<algorithm>', CONCAT_WS('|', f1, f2, f3, f4 ...)
FROM Table1
算法> :: = MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512
答案 1 :(得分:1)
一种方法是concat()
字段以及定界符。对于任何日期,请手动将其格式化为字符串以控制格式。
HashValue as HASHBYTES('SHA2_256', CONCAT(ID,'|',name,'|',address))
需要定界符来处理空字段,因此 ID:1名称:“地址:'12'与ID:1名称:'12'地址:”不同。
答案 2 :(得分:1)
使用此:
SELECT *,
HASHBYTES('MD5', (SELECT ID, name, address FOR XML RAW))
FROM Table1