SQL Server - 生成唯一 ID 以比较多个列

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

在SQL Server中,是否可以使用特定的数据作为输入值来生成GUID。例如,

DECLARE @seed1 VARCHAR(10) = 'Test'
DECLARE @seed1 VARCHAR(10) = 'Testing'
SELECT NEWID(@seed1) -- will always return the same output value
SELECT NEWID(@seed2) -- will always return the same output value, and will be different to the example above

我知道这完全违背了 GUID 的观点,因为 ID 不是唯一的。我正在寻找一种根据某些标准(@seed 值)检测重复记录的方法。

我尝试使用

VARBINARY
函数生成
HASHBYTES
字符串,但是使用
VARBINARY
在表之间连接似乎非常慢。我希望找到一种更有效的类似替代方案。

编辑:了解有关我为什么要实现这一目标的更多信息。

我正在寻找一种快速有效的方法来检测两个表中存在的重复信息。例如,我有名字、姓氏和电子邮件。当它们串联起来时,应该可以用来检查这些记录是否存在于表A和表B中。

简单地加入这些字段是可能的,并提供正确的结果,但速度相当慢。因此,我希望找到一种将数据“转换”为 GUID 之类的方法,这将使连接更加高效。

sql sql-server hash sql-server-2014 guid
3个回答
4
投票
CHECKSUM

函数返回 int 类型。


2
投票
hashbytes

而不是

checksum
,如下所示:

SELECT hashbytes('MD5', 'JOHN' + ',' + 'SMITH' + ',' + '[email protected]')

虽然校验和产生具有 2 个完全不同值的相同数字的可能性很小,但我已经在大约一百万个数据集上发生过这种情况。  正如 iamdave 指出的(谢谢!),最好添加某种分隔符(在我的示例中为逗号),这样您就不会将 
'JOH' + 'NSMITH'

'JOHN' + 'SMITH'
进行相同的比较。

http://www.sqlservercentral.com/blogs/microsoft-business-intelligence-and-data-warehousing/2012/02/01/checksum-vs-hashbytes/


0
投票

声明 @seed1 VARCHAR(10) = '测试'

声明 @seed1 VARCHAR(10) = '测试'

选择 CAST(HASHBYTES('SHA2_512',@seed1) 作为唯一标识符)

选择 CAST(HASHBYTES('SHA2_512',@seed2) 作为唯一标识符)

© www.soinside.com 2019 - 2024. All rights reserved.