2009-08-12 17 views
26

SQL ServerのMERGEステートメントからアクションカウントを取得する最善の方法として、y'allsが推奨するものは何ですか?Sql Server 2008 MERGE - カウントを取得する最良の方法

つまり、いくつかの挿入、いくつかの更新といくつかの削除を行うMERGEを実行します...私はHOW MANYの挿入、HOW MANYの更新、およびHow Manyの削除を見つけることができます。

これを行うにはどうすればよいでしょうか?

答えて

31

MERGEステートメントにOUTPUT句を指定し、MERGE中に実行されたことの出力レポートを取得できます。

MERGE (targetTable) AS t 
USING (sourceTable) AS s 
ON t.ID = s.ID 
WHEN MATCHED THEN 
    (some statements) 
WHEN NOT MATCHED THEN 
    (some statements) 
OUTPUT 
    $action, inserted.ID 'inserted', deleted.ID 'deleted' 
; 

これは、各操作の各「アクション」(挿入、更新、削除)の行を提供します。ステートメントがたくさんある場合は、@tableVarにOUTPUT INTOを実行してから、テーブル変数を参照することもできます。

DECLARE @tableVar TABLE (MergeAction VARCHAR(20), InsertedID INT, DeletedID INT) 

MERGE (targetTable) AS t 
USING (sourceTable) AS s 
ON t.ID = s.ID 
WHEN MATCHED THEN 
     (some statements) 
WHEN NOT MATCHED THEN 
     (some statements) 
OUTPUT 
     $action, inserted.ID 'inserted', deleted.ID 'deleted' INTO @tableVar 
; 

SELECT MergeAction, COUNT(*) 
FROM @tableVar 
GROUP BY MergeAction 

MERGE声明とOUTPUT clauseの詳細については、オンラインブックをチェックしてください。

マルク・

+0

これは何らかの理由で1つのステートメントで、おそらくグループでこれを行うことはできますか?出力ビットは> OUTPUT $ ACTION、COUNT(1)GROUP BY $ ACTIONの行に沿った何らかのものになるでしょうか? – eidylon

+0

いいえ、これはできません。 SSMSの出力ウィンドウに出力するだけでも、テーブル変数に出力することもできます.OUTPUT節をオーバーストレッチしないでください! :-) –

+0

ああ...実際には、OUTPUTはテーブル変数、または結果セットを出しますか? SELECTステートメント内のOUTPUT句でMERGEステートメントをソースとしてサブクエリとしてラップし、その外部SELECTに集約を実行させることは可能でしょうか? ...可能な音。私はそれで遊ぶ必要があるかもしれません。 – eidylon

1

方法について:

INSERT YourResultsTable (action, cnt) 
SELECT action, count(*) 
FROM 
(
    MERGE (targetTable) AS t 
    USING (sourceTable) AS s 
     ON t.ID = s.ID 
    WHEN MATCHED THEN  (some statements) 
    WHEN NOT MATCHED THEN  (some statements) 
    OUTPUT $action as action, inserted.ID as ins, deleted.ID as del 
) m 
GROUP BY action; 

[編集]オクラホマので、試してみてください。

INSERT YourResultsTable (action) 
SELECT action 
FROM 
(
    MERGE (targetTable) AS t 
    USING (sourceTable) AS s 
     ON t.ID = s.ID 
    WHEN MATCHED THEN  (some statements) 
    WHEN NOT MATCHED THEN  (some statements) 
    OUTPUT $action as action, inserted.ID as ins, deleted.ID as del 
) m; 

(その後、カウント結果)

ロブ

+0

Nope:メッセージ10717、レベル15、状態1、行48 FROM句にネストされたINSERTが含まれている場合、GROUP BY句は使用できません、UPDATE、DELETE、またはMERGEステートメントを使用します。 –

+0

SQL Server 2008 Developer Edition –

+0

でテストしました。私はあなたの編集を使用して、挿入したテーブルを取り出し、Case-Statementsを使用して個々のアクションをSUM-Totalsに集めてログに記録しました。それは素晴らしい作品です! SQL Serverは、最外のSelectに直接int変数を集約して設定するのではなく、マージ結果をテーブル変数に挿入するようにします。 – MikeTeeVee

4

indivに抽出するにはinitは0にvarsの場合

declare 
     @mergeResultsTable table (MergeAction VARCHAR(20)); 

    declare 
     @insertCount int, 
     @updateCount int, 
     @deleteCount int; 

    merge ... 
    output $action into @mergeResultsTable; 

    select @insertCount = [INSERT], 
      @updateCount = [UPDATE], 
      @deleteCount = [DELETE] 
     from (select 'NOOP' MergeAction -- row for null merge into null 
      union all 
      select * from @mergeResultsTable) mergeResultsPlusEmptyRow  
    pivot (count(MergeAction) 
     for MergeAction in ([INSERT],[UPDATE],[DELETE])) 
     as mergeResultsPivot; 

組合行を除去することができる「NOOP」又はそのソースまたはターゲットテーブル> 0行を有する知っている:idual VARSは、ピボットを用いmarc_sによる処理回答を投稿することができます。

関連する問題