データベースの構造を変更しています。テーブル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
を(ab)使用できると思います。最初に(一時的な)テーブルを作成します。
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