この素晴らしい記事を読んだ後、私は自分の答えを見つけました。
http://sqlblog.com/blogs/adam_machanic/archive/2009/08/24/dr-output-or-how-i-learned-to-stop-worrying-and-love-the-merge.aspx
MERGEとそのOUTPUT句を使用して、探していたものを実現しました。これは、これを理解するために使用したサンプルコードです。
まず、#Temp2、#Temp3、#Temp4の3つの一時テーブルを作成しました。#Temp2はソーステーブルと見なされます。#Temp3がターゲットテーブルになり、#Temp4がブリッジになります。次に、非常に単純なデータを数行挿入しました。この場合は、値という1つのフィールドだけです。
CREATE TABLE #Temp2(
OldID INT IDENTITY(1,1),
Value INT,
NewFK INT)
CREATE TABLE #Temp3(
NewerID INT IDENTITY(1,1),
Value INT)
CREATE TABLE #Temp4(
OldID INT NOT NULL,
NewerID INT NOT NULL,
Value INT)
INSERT INTO #Temp2(Value)
VALUES(30), (40), (50), (70)
INSERT INTO #Temp3(Value)
VALUES (333), (444), (555), (777)
次に、ダーティな作業を行うMERGEステートメントがあります。#Temp2から値を取得し、それを#Temp3に入れます。次に、#Temp3で作成されたID、#Temp2からのID、および渡された値を取得し、それらをすべて#Temp4にスローします。
MERGE INTO #Temp3 AS tgt
USING #Temp2 AS src
ON 1=0
WHEN NOT MATCHED THEN
INSERT(
Value)
VALUES(
src.Value)
OUTPUT
src.OldID,
INSERTED.NewerID,
src.Value
INTO #Temp4(OldID, NewerID, Value);
次に、ステージングテーブル#Temp2に対してUPDATEを実行して、NewFKフィールドを新しいIDで更新しました。最後に、単純なSELECTを実行して、更新された情報を確認します。
UPDATE X
SET X.NewFK = Z.NewerID
FROM #Temp2 X
JOIN #Temp4 Z
ON X.OldID = Z.OldID
SELECT * FROM #Temp2
これは私が必要としていたことを正確に達成し、物事を行うためのかなり合理化された方法です。これがこの質問に出くわす一部の人々に役立つことを願っています。あなたの洞察と反応をみんなに感謝します。
注:
MERGEはSQLServer2008で導入されたと思います。
ジョナサン