我有两个表,第一个有一个主键是一个标识,第二个有一个主键不是,但是该键有一个外键约束回到第一个表的主键。
如果我一次插入一条记录,我可以使用Scope_Identity来获取刚插入到表1中的pk的值,我想插入到第二个表中。
我的问题是我有很多记录来自我想在两个表中插入的选项,我无法想到基于集合的方法来执行这些插入。
我目前的解决方案是使用游标,插入第一个表,使用scope_identity获取密钥,插入第二个表,重复。
我错过了非光标解决方案吗?
答案 0 :(得分:2)
是的,在线查阅图书中的输出条款。
答案 1 :(得分:0)
本周我遇到了这个问题:有人将一个带有无意义代理键的表引入到使用自然键的模式中。毫无疑问我会很快解决这个问题:)直到那时,我正在通过创建一个数据表来解决它:INSERT
来自:{}可以是永久或临时基表或派生表(见下文) ,无论如何,这应该适合您对基于集合的解决方案的需求。使用此表与表之间的连接以及自然键上的IDENTITY
列来查找自动生成的值。这是一个简短的例子:
CREATE TABLE Test1
(
surrogate_key INTEGER IDENTITY NOT NULL UNIQUE,
natural_key CHAR(10) NOT NULL CHECK (natural_key NOT LIKE '%[^0-9]%') UNIQUE
);
CREATE TABLE Test2
(
surrogate_key INTEGER NOT NULL UNIQUE
REFERENCES Test1 (surrogate_key),
data_col INTEGER NOT NULL
);
INSERT INTO Test1 (natural_key)
SELECT DT1.natural_key
FROM (
SELECT '0000000001', 22
UNION ALL
SELECT '0000000002', 55
UNION ALL
SELECT '0000000003', 99
) AS DT1 (natural_key, data_col);
INSERT INTO Test2 (surrogate_key, data_col)
SELECT T1.surrogate_key, DT1.natural_key
FROM (
SELECT '0000000001', 22
UNION ALL
SELECT '0000000002', 55
UNION ALL
SELECT '0000000003', 99
) AS DT1 (natural_key, data_col)
INNER JOIN Test1 AS T1
ON T1.natural_key = DT1.natural_key;