是否可以为表中的所有列生成哈希值?

问题描述 投票:0回答:3

我无法想出一种方法来为表中的每条记录生成哈希值。我正在将记录从 1 个 SQL 数据库插入到另一个数据库。我的源表和目标表是相同的,只是在目标表中我有一个额外的 hash_dif 列。如何根据表中的列创建哈希值,然后将该哈希值与我从源表中选择的所有数据一起插入到目标表中?

我想要:

SELECT * FROM DBO.SOURCE_TABLE

我也想生成这样的哈希值:

select HashBytes('md5',convert(varbinary(max),(SELECT * FROM DBO.SOURCE_TABLE FOR XML AUTO))) as hash1

我很困惑如何在生成哈希值时从源中选择所有数据,然后一次性选择该哈希值?

sql sql-server hash
3个回答
1
投票

您需要连接所有列,如下所示,必须转换 NULL 值和数字

CREATE TABLE dbo.Test1 (c1 NVARCHAR(32), c2 NVARCHAR(32));  
INSERT dbo.Test1 VALUES ('This is a test.','withanotherstring');  
INSERT dbo.Test1 VALUES ('This is test 2.', 'yetanaitherstring');  
SELECT HASHBYTES('SHA2_256', CONCAT(c1,c2)) FROM dbo.Test1;  
(无栏名)
0x5E084B7988679136039B6B566496720BCBAB1BD965C0F071DA27AE2833B0B46C
0x731F2E0E7955C2625CDE41D652C5ADC440BDFE5AF430135FC76894ED8E38E6C9

小提琴


1
投票

您可以使用 HASHBYTES 函数和子查询的组合。 这是一个示例查询:

INSERT INTO DBO.TARGET_TABLE (col1, col2, col3, hash_diff)
SELECT 
    col1,
    col2,
    col3,
    HASHBYTES('md5', CONVERT(varbinary(max), (SELECT col1, col2, col3 FROM DBO.SOURCE_TABLE WHERE SOURCE_TABLE.ID = TARGET_TABLE.ID FOR XML AUTO))) as hash_diff
FROM DBO.SOURCE_TABLE

0
投票

如果您不想指定所有列,这只是另一个选项。

Select A.*
      ,B.HB
 From  YourTable A
 Cross Apply ( values ( hashbytes('SHA2_512',(Select A.* for JSON PATH) ) ) ) B(HB)
© www.soinside.com 2019 - 2024. All rights reserved.