Sql-Server

插入與子查詢表相關的 OUTPUT

  • April 9, 2014

我正在修改數據庫的結構。表FinancialInstitution的幾列的內容必須轉移到表Person中。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 無法以這種方式關聯……

我想你可以(ab)使用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-Fiddle

引用自:https://dba.stackexchange.com/questions/62854