8

MERGE 演算子の使用方法を学習しようとしています。次のコードは正しくコンパイルされます。

    ALTER PROCEDURE moto.procPM_UpdateLines
@LineId As Int = null,
@LineName As Varchar(100),
@DeleteMe As Bit = 0
    AS
    BEGIN

    MERGE moto.tblPMLine AS line
    USING (SELECT LineId, LineName FROM moto.tblPMLine) AS existsLine
    ON line.LineId = existsLine.LineId
    WHEN MATCHED AND @DeleteMe = 1 THEN DELETE
    WHEN MATCHED AND @DeleteMe = 0 THEN UPDATE SET line.LineName = @LineName
    WHEN NOT MATCHED THEN INSERT(LineName) VALUES(@LineName);
    END
    GO

これは非常に単純な手順ですが、何らかの理由で、次のコマンドを使用してもエントリが生成されないようです。

    execute moto.procPM_UpdateLines null, 'First test', 0

どのオプションに従っているのかを知る方法はありますか?


以前のストアド プロシージャが修正されました。

   MERGE INTO moto.tblPMLine AS T
   USING (SELECT @LineId as LineId, @LineName as LineName) AS S
   ON T.LineId = S.LineId
   WHEN MATCHED AND @DeleteMe = 0 THEN --UPDATE
        UPDATE SET LineName = @LineName 
   WHEN MATCHED AND @DeleteMe = 1 THEN --DELETE
        DELETE
   WHEN NOT MATCHED THEN--INSERT
        INSERT (LineName) VALUES (@LineName)    
   OUTPUT $action AS ChangesMade;

現在は、挿入、更新、および削除を行い、出力を返します。

4

2 に答える 2

12

MERGEと句を組み合わせて、OUTPUT何が行われているのかについてのある種の「アクティビティレポート」(または「printステートメント」のデバッグ)MERGEを取得できます。これは、何が問題になっているのかを理解するのに役立つかもしれません。

AdamMachanicの優れたブログ投稿Dr.OUTPUTまたは:そのテクニックとその使用方法を示すMERGEを心配するのをやめ、愛することをどのように学んだかを参照してください。

基本的にはOUTPUT、ステートメントで句を使用してMERGE、何が起こっているのかに関する情報を取得することになります。

MERGE INTO ......
WHEN MATCHED THEN
    .......
WHEN NOT MATCHED THEN
    ......
WHEN NOT MATCHED BY SOURCE THEN
    ........
OUTPUT
    $action AS dml_action,
    inserted.x AS new_x,
    deleted.x AS old_x,
    inserted.y AS new_y,
    deleted.y AS old_y;
于 2013-02-15T15:56:19.367 に答える
1
MERGE moto.tblPMLine AS line
USING (SELECT LineId, LineName FROM moto.tblPMLine WHERE LineID = @LineID) AS existsLine

使ってないので許してくださいMERGE@LineIDただし、変数を使用するコードは表示されません。

于 2013-02-15T15:53:13.310 に答える