我无法想出一种方法来为表中的每条记录生成哈希值。我正在将记录从 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
我很困惑如何在生成哈希值时从源中选择所有数据,然后一次性选择该哈希值?
您需要连接所有列,如下所示,必须转换 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 |
您可以使用 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
如果您不想指定所有列,这只是另一个选项。
Select A.*
,B.HB
From YourTable A
Cross Apply ( values ( hashbytes('SHA2_512',(Select A.* for JSON PATH) ) ) ) B(HB)