2

2つのテーブルのデータを3つ目のテーブル(すべて同じスキーマを持つ)にマージし、古いID値から新しいID値へのマッピングを生成する必要があります。明らかなアプローチは、カーソルを使用してソーステーブルをループし、途中で新旧のID値を挿入することです。これを行うためのより良い(おそらくセット指向の)方法はありますか?

更新:もう1つの情報:宛先テーブルにはすでにデータがあります。

4

3 に答える 3

3

新しいIDのIDENTITY列を使用してマッピングテーブルを作成します。ソーステーブルからこのテーブルに挿入し、マッピングを作成します。

SET IDENTITY_INSERT ONターゲットテーブル用。

マッピングテーブルに結合されたソーステーブルからターゲットテーブルに挿入し、次にSET IDENTITY_INSERT OFF

于 2010-10-19T20:33:59.833 に答える
2

ステートメントのOUTPUT句に基づいてマッピングテーブルを作成しました。MERGE必要ありませんIDENTITY_INSERT

以下の例では、とがRecordImportQueueあり、はへのFKです。これらのステージングテーブルのデータはとに移動する必要があり、FKを保持する必要があります。RecordDataImportQueueRecordDataImportQueue.RecordIDRecordImportQueue.RecordIDRecordRecordData

RecordImportQueue to Recordは、MERGEステートメントを使用して実行され、そのステートメントからマッピングテーブルを生成し、OUTPUTRecordDataImportQueueは、マッピングテーブルに結合されたソーステーブルの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

元の投稿からかなり経ちましたが、これが他の人の役に立つことを願っています。フィードバックをお待ちしています。

于 2013-03-25T16:24:12.130 に答える
1

古いIDを保持するために、新しいテーブルに一時的に列を追加すると思います。挿入が完了したら、マッピングを別のテーブルに抽出して、列を削除できます。

于 2010-10-19T19:56:17.660 に答える