插入与OUTPUT相关的子查询表


22

我正在修改数据库的结构。表FinancialInstitution的几列内容必须转移到表Person中。FinancialInstitution通过外键链接到“人”。每个金融机构都需要其相应人员的ID。因此,对于在Person中插入的每个新行,此新行的ID(IDENTITY)必须复制回FinancialInstitution的相应行中。

显而易见的方法是迭代的T-SQL代码。但是我有兴趣知道是否只有基于集合的操作才有可能做到这一点。

我以为这样的请求的内部层是这样的:

INSERT INTO Person (Street1, Number1, City1, State1, PostCode1, CountryId1, WorkDirectPhone1, Fax1, Email1)
OUTPUT inserted.Id, FinancialInstitution.Id
SELECT Id, Street, Number, City, [State], PostCode, CountryId, PhoneNumber, Fax, Email
FROM FinancialInstitution;

不幸的是,看来OUTPUT无法以这种方式建立关联...


是否要在表中插入行Person?还是更新现有的?还是您想插入Person然后UPDATE FinancialInstitution
ypercubeᵀᴹ

您的查询仅更新人员表。您可以捕获insert.ID,但不能捕获FinancialInstitution.ID,除非您在插入部分中使用它。查询的坐姿,如果删除了OUTPUT子句,则会出现错误,因为INSERT语句中的列数与SELECT语句不匹配。
datagod 2014年

ypercube:我想插入到Person中,然后使用Person中新行的ID更新FinancialInstitution。
Yugo Amaryl 2014年

datagod:我知道它唯一的更新,此查询是将来解决方案的嵌套级别。但是我已经被困在那里了。正确,如果我不插入ID,则无法将其添加到选择中。
Yugo Amaryl 2014年

1
@YugoAmaryl,您可以尝试采用此示例使用OUTPUT子句捕获多行插入中的标识值
DenisT 2014年

Answers:


18

我想你可以(滥用)MERGE这个。首先创建一个(临时的)表:

CREATE TABLE tempIDs
( PersonId INT, 
  FinancialInstitutionId INT
) ;

然后MERGE放入Person(而不是INSERT),因此您可以使用OUTPUT子句中涉及的表的列:

MERGE INTO Person 
USING FinancialInstitution AS fi
  ON 1 = 0
WHEN NOT MATCHED THEN
  INSERT (Street1, Number1, City1, ...)
  VALUES (fi.Street, fi.Number, fi.City, ...)
OUTPUT inserted.Id, fi.Id
  INTO tempIDs ;

然后使用临时表执行以下操作UPDATE FinancialInstitution

UPDATE fi
SET fi.PersonId = t.PersonId
FROM FinancialInstitution AS fi
  JOIN tempIDs AS t
    ON fi.Id = t.FinancialInstitutionId ; 

在以下位置进行测试:SQL小提琴

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.