因此,您可以使用以下语法一次INSERT多行:
INSERT INTO Table
SELECT Field1,
Expression2
FROM DataSource
为行插入子记录的常见模式可能是语法,如:
INSERT INTO Table2 (Field1, Field2)
VALUES (Expression1, Expression2)
UPDATE Table1
SET Table2ID = SCOPE_IDENTITY()
WHERE Table1ID = @ParentID
有没有办法合并这两个概念,快速插入一系列子记录,其中每个子记录的父ID都是已知的(而不是全部相同),并且子ID由{分配} {1}}列,以及父记录引用子记录的位置?
这是一个示例架构:
IDENTITY
(精明的读者可能会注意到这是一对一(零或一)关系。这表明只需使用CREATE TABLE Table2 -- Child table
(
Table2ID INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
Field1 ...,
Field2 ...,
)
CREATE TABLE Table1 -- Parent Table
(
Table1ID INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
FieldA ...,
FieldB ...,
Table2ID INT NULL FOREIGN KEY REFERENCES Table2 (Table2ID)
)
的密钥作为Table1
的关键遗憾的是,这在这里并不起作用。这些表是更大模式的一部分,其中Table2
可以在多个其他表中包含父项,并且还可以包含独立的记录。)
我的输入是一个表变量Table2
,其中包含@IDs
个列表。此输入标识的Table1ID
条记录的子集具有Table1
个值。我的目标是为每个记录创建一个新的NULL Table2ID
记录,同时更新Table2
记录以指向他们的新孩子。
我已经尝试了CTE的每个组合以及我能想到的Table1
条款,并且找不到在每个新OUTPUT
旁边插入Table1ID
的方法。 INSERTED.Table2ID
子句不能引用不属于OUTPUT
语句的目标表的列。
不起作用:
INSERT
我能想到的唯一方法是:
更新WITH NewData (Table1ID, Field1, Field2)
AS
(
SELECT Table1ID,
Expression1,
Expression2
FROM Table1 INNER JOIN @IDs AS IDs
ON Table1.Table1ID = IDs.Value
WHERE Table2ID IS NULL
)
INSERT INTO Table2 (Field1, Field2)
OUTPUT INSERTED.Table2ID, NewData.Table1ID -- Error here
VALUES (NewData.Field1, NewData.Field2)
的架构以包含Table2
。有了这个,Table1ID
语句可以从INSERT
语句中生成Table1ID
语句,根据SELECT
父记录生成Table2
字段,并将其放入实际插入的数据。随后的陈述可以反转参考的方向,并填充Table1
中的Table2ID
值。
在Table1
输入序列上使用游标,并为每个新@IDs
记录单独执行单行INSERT
语句。相应的Table2
记录可以立即Table1
与UPDATE
一起使用。
但是,第一个选项需要永久更改架构以在此操作中存储临时数据,第二个选项需要手动迭代记录,否定准备将一批行插入单个行中的性能优势语句到数据库引擎。
有更好的方法吗?
答案 0 :(得分:0)
您的问题似乎有点奇怪 - 它在几个地方引用了具有“子”的父表,但是对于您描述的模式,Table1(父级)在任何时候都只能拥有一个Table2子级 - 这是一对一的关系。
事实上你已经注意到了这一点,在那里用父Table1 id插入多个Table2条目要容易得多(因为这样可行)。
如果您想要的是一对一的关系,那么更常见的架构可能是:
CREATE TABLE Table1 -- Parent Table
(
Table1ID INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
FieldA ...,
FieldB ...
)
CREATE TABLE Table2 -- Child table
(
Table1ID INT NOT NULL PRIMARY KEY,
Field1 ...,
Field2 ...,
)
ALTER TABLE Table2 ADD CONSTRAINT FK_T2_T1 FOREIGN KEY (Table1ID)
REFERENCES Table1 (Table1ID)
GO
在这种情况下,不会生成子项中的主键,而是匹配父表中的PK。