it-swarm.com.de

Einfügen mit OUTPUT korreliert mit Unterabfragetabelle

Ich ändere die Struktur einer Datenbank. Der Inhalt mehrerer Spalten der Tabelle FinancialInstitution muss in die Tabelle Person übertragen werden. FinancialInstitution ist mit einer Person mit einem Fremdschlüssel verknüpft. Jede FinancialInstitution benötigt die ID der entsprechenden Person. Daher muss für jede neue Zeile, die in Person eingefügt wird, die ID dieser neuen Zeile (IDENTITY) in die entsprechende Zeile von FinancialInstitution zurückkopiert werden.

Der offensichtliche Weg, dies zu tun, ist ein iterativer T-SQL-Code. Aber ich bin daran interessiert zu wissen, ob es möglich ist, dies nur mit satzbasierten Operationen zu tun.

Ich stellte mir vor, dass die innere Ebene einer solchen Anfrage ungefähr so ​​aussehen würde:

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;

Leider scheint OUTPUT nicht so zu korrelieren ...

22
Yugo Amaryl

Ich denke, Sie könnten (ab) MERGE dafür verwenden. Erstellen Sie zunächst eine (temporäre) Tabelle:

CREATE TABLE tempIDs
( PersonId INT, 
  FinancialInstitutionId INT
) ;

Dann MERGE in Person (anstelle von INSERT), sodass Sie Spalten der Tabellen verwenden können, die an der Klausel OUTPUT beteiligt sind:

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 ;

Verwenden Sie dann die temporäre Tabelle, um UPDATE FinancialInstitution:

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

Test bei: SQL-Fiddle

18
ypercubeᵀᴹ