Tsql T-SQL中的确定性GUID生成

Tsql T-SQL中的确定性GUID生成,tsql,guid,uniqueidentifier,Tsql,Guid,Uniqueidentifier,我必须准备一个脚本,从几个表中选择数据,并在存储某种多对多关系的表中插入新行 所以,基本上,我有两个表,其中uniqueidentifier字段作为主键,另一个表存储这些表中的两个外键和一些附加数据。这个表的主键也是uniqueidentifier 问题是我不能使用newid为生成的数据生成guid。其中一个要求是,当脚本在相同的表上运行时,它会生成相同的结果主键。因此,我必须想出一个脚本,该脚本将插入具有uniqueidentifier值的新行,该值是基于另外两个uniqueidentifie

我必须准备一个脚本,从几个表中选择数据,并在存储某种多对多关系的表中插入新行

所以,基本上,我有两个表,其中uniqueidentifier字段作为主键,另一个表存储这些表中的两个外键和一些附加数据。这个表的主键也是uniqueidentifier

问题是我不能使用newid为生成的数据生成guid。其中一个要求是,当脚本在相同的表上运行时,它会生成相同的结果主键。因此,我必须想出一个脚本,该脚本将插入具有uniqueidentifier值的新行,该值是基于另外两个uniqueidentifier值生成的

现在,我不知道有什么函数可以提供从一个GUID到另一个GUID的映射。可能没有。但我仍然希望听到一些建议和建议

此外:

我们可以假设任何一对外键在整个表中都是唯一的 我无法更改上述任何表中主键字段的类型 它主要是SQLServer2005/2008,但有些可能运行SQLServer2000
提前感谢。

您最好的答案是生成一个脚本,该脚本是一个insert语句列表。 此脚本可以从生成动态SQL字符串的另一个脚本生成。 您可能会迭代地执行此操作,在每个循环中调用guid函数

通过这种方式,最后您将有一个插入列表,可以使用guid多次运行,结果相同

但是生成guid的一个维度是时间,因此您永远无法重现guid,这是一种真正的点

您可以首先使用校验和从多个列中获取整数值,然后将其转换回guid:

CREATE TABLE ResultTable ([primaryKey] UNIQUEIDENTIFIER,[foreignA] INT, [foreignB] INT);
CREATE TABLE foreignTableB(primaryKey INT);
INSERT INTO foreignTableB(primaryKey) VALUES (1),(2),(3),(4),(5),(100),(1000);


DECLARE @foreignKeyA INT = 1;

INSERT ResultTable ([primaryKey],[foreignA], [foreignB])
SELECT CAST(CAST(CHECKSUM(@foreignKeyA, fb.primaryKey) AS VARBINARY(4)) AS UNIQUEIDENTIFIER)
      , @foreignKeyA, fb.[primaryKey]
FROM foreignTableB as fb;

SELECT * FROM ResultTable;

听起来这与取整数1和整数2,并将它们混合在一起,这样整数3就可以用作主键。我不知道有什么方法可以100%确定任何两对整数或guid不产生相同的输出整数。如果你能找到一个生成GUID的算法,那么散列算法可能会让你接近它values@Philip凯利:我很确定我可以通过将两个guid转换为字符串,并使用字符对它们重新排序,然后将结果字符串转换回uniqueidentifier来完成类似的工作。我可能最终会做这样的事情,尽管这是一个令人难以置信的混乱,很可能是一个坏主意,但我决定我不必感谢你晚了一点的建议,这几乎就是我昨天做的事情。它并没有真正回答关于生成uniqueidentifier值的问题,但它解决了我的问题,所以我标记您的答案。
CREATE TABLE ResultTable ([primaryKey] UNIQUEIDENTIFIER,[foreignA] INT, [foreignB] INT);
CREATE TABLE foreignTableB(primaryKey INT);
INSERT INTO foreignTableB(primaryKey) VALUES (1),(2),(3),(4),(5),(100),(1000);


DECLARE @foreignKeyA INT = 1;

INSERT ResultTable ([primaryKey],[foreignA], [foreignB])
SELECT CAST(CAST(CHECKSUM(@foreignKeyA, fb.primaryKey) AS VARBINARY(4)) AS UNIQUEIDENTIFIER)
      , @foreignKeyA, fb.[primaryKey]
FROM foreignTableB as fb;

SELECT * FROM ResultTable;