2017-10-02 4 views
0

をマージします。デバッグSQLは、私は、次のコードをデバッグしたい

ターゲットテーブルは現時点では空ですので、の部分を実行する必要がありますが、動作しません。また、INSERTステートメントが呼び出されていないかどうか、またはこのステートメントにはエラーがあります。

私は通常、SQLのデバッグ方法、次の使用

:データベーステーブル内

  • 検証した結果
  • 優先度の低いPRINTまたはRAISEERROR
  • データベースで確認することができないデバッグデータをチェックするための特別なテーブルDevelopmentLog、別々のINSERT文を使用して実行時に読み込みとログを取ることができます。

しかし、何も1だけDELETEUPDATEまたはINSERT文を持っているし、私の知る限りでは、定義されたソース表とターゲット表でのみ動作することができMERGE条件、内で使用可能ではありません。

私はSQLのデバッグオプションが貧弱であることを知っているが、私はこのクエリでは

+3

あなたは 'MERGE'は、それが挿入する行を持っている場合、それは行を挿入しないバグのいくつかの並べ替えを持っていないこと(可能性の小さなマージン内に)想定することができます。内側の 'SELECT'が返すものを確認してください。あなたが目標条件であなたの目標テーブルとそれをLEFT JOINするなら、それが返すものをチェックしてください。それらはあなたのデバッグ支援です。 'MERGE'は魔法ではありません。特に、 'INSERT'、' UPDATE'、 'DELETE'を単独で実行することはできません。ちょっと単純です(そして時にはときどき)。 –

+0

私の言うことを忘れていましたが、内側のSELECTはうまくいきました。 LEFT JOINトリックは良いヒントです(それはおそらく答えとして入れられる価値があります)、エイリアスの不一致につながりますが、内部SELECTに等しいので問題の原因にはならないようです期待される。 –

+0

@ JeroenMostert - 不必要にペダンティックですが、おそらくINSERT、UPDATE、DELETEを使って実現できないもの - これらの3つのコマンドを組み合わせて実行する単一のアクションが可能ですすべてが評価された後でのみ制約を再検証します。例えば。それらが常に有効であるように、挿入*と*更新を必要とする相互参照の相互キーを持つことができます。 –

答えて

2

...を通して方法を見つけることを期待しています、SRCテーブルがマージを許可する有効なレコードを持っているあなたは確かです。

OUTPUT clause with MERGEを使用すると、実行後すぐに結果を確認できます。

OUTPUT INSERT、UPDATE、DELETE、またはMERGEステートメントの影響を受ける各行からの情報、またはそれに基づく式を返します。これらの結果は、確認メッセージ、アーカイブ、および他のそのようなアプリケーション要件などの用途で処理アプリケーションに返すことができます。

MERGE PlDayCap AS TGT 
USING 
    (SELECT MID, CalDate, SUM(CapAva) as aTime FROM PSP WHERE CalDate > DATEADD(DAY,-5,GETDATE()) GROUP BY CalDate,MID) 
    AS SRC(MID, cDate, aTime) 
ON (SRC.cDate = TGT.cDate AND SRC.MID = TGT.MID) 
WHEN MATCHED THEN 
    UPDATE SET TGT.aTime = SRC.aTime 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (cDate, MID, aTime, uTime) VALUES (SRC.cDate, SRC.MID, SRC.aTime, 0)   
WHEN NOT MATCHED BY SOURCE THEN 
    DELETE 
OUTPUT $action, inserted.*, deleted.*; 
+0

これは素晴らしいヒントです、私は出力を考えませんでした。私はそれを答えとしてマークします。内側のSELECTは有効な結果テーブルを提供します。しかし、内側のSELECTに対応する行を持つUPDATE文だけのリストが得られるので、謎が解消されます。私はターゲットテーブル**空**でどのように可能かと思います。 –

関連する問題