我正在修改数据库的结构。表FinancialInstitution的几个列的内容必须转移到表Person中。FinancialInstitution 使用外键链接到 Person。每个金融机构都需要其对应人员的 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 无法以这种方式关联......
我想你可以(滥用)使用MERGE这个。首先创建一个(临时)表:
MERGE
CREATE TABLE tempIDs ( PersonId INT, FinancialInstitutionId INT ) ;
然后MERGEinto Person(而不是),因此您可以使用子句INSERT中涉及的表的列:OUTPUT
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 FinancialInstitution
UPDATE fi SET fi.PersonId = t.PersonId FROM FinancialInstitution AS fi JOIN tempIDs AS t ON fi.Id = t.FinancialInstitutionId ;
测试地点:SQL-Fiddle