3

MERGEデータを更新するクエリがあります。一致しない場合は、ソースにレコードを挿入して、出力を一時テーブルに取得します。

一致したレコードを一時テーブルにも取得することは可能でしょうか? 基本的に、以降の処理でデータの重複を避けるために、一致したレコードのコピーが必要です。

これは私のMERGEコマンドです:

MERGE Product.ProductHeaderRepository AS t 
USING (SELECT GETDATE() as d, c1, c2, c3,
Name FROM Supplier.ProductHeaderImport
WHERE (BatchID = @BatchID) ) AS s
ON dbo.GetProductHeaderId(s.c1,S.c2,S.c3) <0
WHEN NOT MATCHED BY TARGET THEN
  INSERT (Name, c1,c2,c3) VALUES (Name, c2,c2,c3)
OUTPUT INSERTED.iD, s.c1, s.c2, s.c3 INTO @TmpTable;
4

1 に答える 1

13

MATCHED何も変更せず、変数を更新するだけの句を作成できます。

DECLARE @T1 TABLE (A INT, B INT);
DECLARE @T2 TABLE (A INT, B INT);
DECLARE @T3 TABLE (Action VARCHAR(20), A INT, B INT);

INSERT @T1 VALUES (1, 1), (2, 2), (3, 3);
INSERT @T2 VALUES (1, 0), (2, NULL), (4, 0);

DECLARE @I INT; -- VARIABLE TO UPDATE

MERGE @T2 B
USING @T1 A
    ON A.A = B.A
WHEN MATCHED THEN 
    UPDATE SET @I = 1   -- DO NOTHING MEANINGFUL IN THE UPDATE;
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (A, B) VALUES (A.A, A.B)
OUTPUT $action, ISNULL(inserted.A, deleted.A), ISNULL(inserted.B, deleted.B) INTO @T3;

SELECT  *
FROM    @T3;

戻ります:

Action  A   B
INSERT  3   3
UPDATE  1   0
UPDATE  2   NULL

したがって@TmpTable、アクションを保存するために新しい列を追加すると、次を使用して一致した行を取得できます。

SELECT  *
FROM    @TmpTable
WHERE   Action = 'UPDATE';

そして、次を使用して新しい行:

SELECT  *
FROM    @TmpTable
WHERE   Action = 'INSERT';
于 2013-06-17T12:44:46.593 に答える