2つのテーブルのデータを3つ目のテーブル(すべて同じスキーマを持つ)にマージし、古いID値から新しいID値へのマッピングを生成する必要があります。明らかなアプローチは、カーソルを使用してソーステーブルをループし、途中で新旧のID値を挿入することです。これを行うためのより良い(おそらくセット指向の)方法はありますか?
更新:もう1つの情報:宛先テーブルにはすでにデータがあります。
2つのテーブルのデータを3つ目のテーブル(すべて同じスキーマを持つ)にマージし、古いID値から新しいID値へのマッピングを生成する必要があります。明らかなアプローチは、カーソルを使用してソーステーブルをループし、途中で新旧のID値を挿入することです。これを行うためのより良い(おそらくセット指向の)方法はありますか?
更新:もう1つの情報:宛先テーブルにはすでにデータがあります。
新しいIDのIDENTITY列を使用してマッピングテーブルを作成します。ソーステーブルからこのテーブルに挿入し、マッピングを作成します。
SET IDENTITY_INSERT ON
ターゲットテーブル用。
マッピングテーブルに結合されたソーステーブルからターゲットテーブルに挿入し、次にSET IDENTITY_INSERT OFF
。
ステートメントのOUTPUT
句に基づいてマッピングテーブルを作成しました。MERGE
必要ありませんIDENTITY_INSERT
。
以下の例では、とがRecordImportQueue
あり、はへのFKです。これらのステージングテーブルのデータはとに移動する必要があり、FKを保持する必要があります。RecordDataImportQueue
RecordDataImportQueue.RecordID
RecordImportQueue.RecordID
Record
RecordData
RecordImportQueue to Recordは、MERGE
ステートメントを使用して実行され、そのステートメントからマッピングテーブルを生成し、OUTPUT
RecordDataImportQueueは、マッピングテーブルに結合されたソーステーブルのSELECTからのをRecordData
使用します。INSERT
DECLARE @MappingTable table ([NewRecordID] [bigint],[OldRecordID] [bigint])
MERGE [dbo].[Record] AS target
USING (SELECT [InstanceID]
,RecordID AS RecordID_Original
,[Status]
FROM [RecordImportQueue]
) AS source
ON (target.RecordID = NULL) -- can never match as RecordID is IDENTITY NOT NULL.
WHEN NOT MATCHED THEN
INSERT ([InstanceID],[Status])
VALUES (source.[InstanceID],source.[Status])
OUTPUT inserted.RecordID, source.RecordID_Original INTO @MappingTable;
その後、次のように参照テーブルにレコードを挿入できます。
INSERT INTO [dbo].[RecordData]
([InstanceID]
,[RecordID]
,[Status])
SELECT [InstanceID]
,mt.NewRecordID -- the new RecordID from the mappingtable
,[Status]
FROM [dbo].[RecordDataImportQueue] AS rdiq
JOIN @MappingTable AS mt
ON rdiq.RecordID = mt.OldRecordID
元の投稿からかなり経ちましたが、これが他の人の役に立つことを願っています。フィードバックをお待ちしています。
古いIDを保持するために、新しいテーブルに一時的に列を追加すると思います。挿入が完了したら、マッピングを別のテーブルに抽出して、列を削除できます。