我必须准备一个脚本,从几个表中选择数据并在表中插入新行,其中存储了某种多对多关系。
因此,基本上,我有两个表uniqueidentifier
字段作为主键,另一个表存储来自这些表的两个外键和一些附加数据。它们的主键也是uniqueidentifier
。
INSERT ResultTable ([primaryKey],[foreignA], [foreignB])
SELECT newid(), /* <- Can't have it! */
@foreignKeyA,
fb.[primaryKey]
FROM foreignTableB as fb
问题是我无法使用newid()
为生成的数据生成GUID。其中一个要求是,当脚本在相同的表上运行时,脚本会产生相同的结果(包括主键)。因此,我必须提出一个脚本,该脚本将插入基于另外两个uniqueidentifier
值生成的uniqueidentifier
值的新行。
现在,我不知道任何提供从一个GUID到另一个GUID的映射的函数。可能没有。但我仍然希望听到一些建议和意见。
此外:
提前致谢。
答案 0 :(得分:2)
这里你最好的答案是生成一个插入语句列表的脚本。 可以从生成动态SQL字符串的另一个脚本生成此脚本。 您可能会迭代地执行此操作,每次循环都会调用guid函数。
最后,您将获得一个插入列表,这些插入可以使用guid以相同的结果多次运行。
但是生成guid的一个方面是时间,所以你永远无法重现guid(这真的是一点点)
答案 1 :(得分:0)
您可以首先使用CHECKSUM
从多个列中获取整数值,然后将其转换回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;