MERGE
を(乱用)使用できます
OUTPUT
を使用 条項。
MERGE
INSERT
できます 、UPDATE
およびDELETE
行。この場合、INSERT
するだけで済みます .1 =0は常にfalseであるため、NOT MATCHED BY TARGET
一部は常に実行されます。通常、他のブランチが存在する可能性があります。ドキュメントを参照してください。WHEN MATCHED
通常、UPDATE
に使用されます;WHEN NOT MATCHED BY SOURCE
通常、DELETE
に使用されます 、ただし、ここでは必要ありません。
この複雑な形式のMERGE
単純なINSERT
と同等です 、ただし、単純なINSERT
とは異なります そのOUTPUT
句を使用すると、必要な列を参照できます。ソーステーブルと宛先テーブルの両方から列を取得できるため、古いIDと新しいIDの間のマッピングを保存できます。
MERGE INTO [dbo].[Test]
USING
(
SELECT [Data]
FROM @Old AS O
) AS Src
ON 1 = 0
WHEN NOT MATCHED BY TARGET THEN
INSERT ([Data])
VALUES (Src.[Data])
OUTPUT Src.ID AS OldID, inserted.ID AS NewID
INTO @New(ID, [OtherID])
;
更新について、生成されたIDENTITY
の順序に依存する 値。
単純なケースでは、[dbo].[Test]
の場合 IDENTITY
があります 列、次にINSERT
ORDER BY
を使用 します 生成されたIDENTITY
を保証します 値は指定された順序になります。 SQLServerでの注文保証のポイント4を参照してください。 a> 。挿入された行の物理的な順序は保証されませんが、IDENTITY
の順序は保証されます。 値が生成されます。
INSERT INTO [dbo].[Test] ([Data])
SELECT [Data]
FROM @Old
ORDER BY [RowID]
ただし、OUTPUT
を使用する場合 条項:
INSERT INTO [dbo].[Test] ([Data])
OUTPUT inserted.[ID] INTO @New
SELECT [Data]
FROM @Old
ORDER BY [RowID]
OUTPUT
の行 ストリームは注文されていません。少なくとも、厳密に言えば、ORDER BY
クエリでは、プライマリINSERT
に適用されます 操作が、OUTPUT
の順序を示すものは何もありません 。だから、私はそれに頼ろうとはしません。 MERGE
を使用する または、ID間のマッピングを明示的に保存する列を追加します。