T-SQL在一个语句

时间:2015-09-29 18:17:39

标签: sql-server database tsql

因此,您可以使用以下语法一次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

我能想到的唯一方法是:

  1. 更新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值。

  2. Table1输入序列上使用游标,并为每个新@IDs记录单独执行单行INSERT语句。相应的Table2记录可以立即Table1UPDATE一起使用。

  3. 但是,第一个选项需要永久更改架构以在此操作中存储临时数据,第二个选项需要手动迭代记录,否定准备将一批行插入单个行中的性能优势语句到数据库引擎。

    有更好的方法吗?

1 个答案:

答案 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。

相关问题