在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 之类的方法,这将使连接更加高效。
函数返回 int 类型。
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/
声明 @seed1 VARCHAR(10) = '测试'
声明 @seed1 VARCHAR(10) = '测试'
选择 CAST(HASHBYTES('SHA2_512',@seed1) 作为唯一标识符)
选择 CAST(HASHBYTES('SHA2_512',@seed2) 作为唯一标识符)