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

时间:2018-09-24 19:12:46

标签: sql-server

我有一个要求,我必须创建由表的所有列组成的哈希值。使用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而不是校验和来完成上述操作?

3 个答案:

答案 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