SQL ServerのMERGEステートメントからアクションカウントを取得する最善の方法として、y'allsが推奨するものは何ですか?Sql Server 2008 MERGE - カウントを取得する最良の方法
つまり、いくつかの挿入、いくつかの更新といくつかの削除を行うMERGEを実行します...私はHOW MANYの挿入、HOW MANYの更新、およびHow Manyの削除を見つけることができます。
これを行うにはどうすればよいでしょうか?
SQL ServerのMERGEステートメントからアクションカウントを取得する最善の方法として、y'allsが推奨するものは何ですか?Sql Server 2008 MERGE - カウントを取得する最良の方法
つまり、いくつかの挿入、いくつかの更新といくつかの削除を行うMERGEを実行します...私はHOW MANYの挿入、HOW MANYの更新、およびHow Manyの削除を見つけることができます。
これを行うにはどうすればよいでしょうか?
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の詳細については、オンラインブックをチェックしてください。
マルク・
方法について:
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;
(その後、カウント結果)
ロブ
Nope:メッセージ10717、レベル15、状態1、行48 FROM句にネストされたINSERTが含まれている場合、GROUP BY句は使用できません、UPDATE、DELETE、またはMERGEステートメントを使用します。 –
SQL Server 2008 Developer Edition –
でテストしました。私はあなたの編集を使用して、挿入したテーブルを取り出し、Case-Statementsを使用して個々のアクションをSUM-Totalsに集めてログに記録しました。それは素晴らしい作品です! SQL Serverは、最外のSelectに直接int変数を集約して設定するのではなく、マージ結果をテーブル変数に挿入するようにします。 – MikeTeeVee
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による処理回答を投稿することができます。
これは何らかの理由で1つのステートメントで、おそらくグループでこれを行うことはできますか?出力ビットは> OUTPUT $ ACTION、COUNT(1)GROUP BY $ ACTIONの行に沿った何らかのものになるでしょうか? – eidylon
いいえ、これはできません。 SSMSの出力ウィンドウに出力するだけでも、テーブル変数に出力することもできます.OUTPUT節をオーバーストレッチしないでください! :-) –
ああ...実際には、OUTPUTはテーブル変数、または結果セットを出しますか? SELECTステートメント内のOUTPUT句でMERGEステートメントをソースとしてサブクエリとしてラップし、その外部SELECTに集約を実行させることは可能でしょうか? ...可能な音。私はそれで遊ぶ必要があるかもしれません。 – eidylon