SQL Serverストアドプロシージャで削除された行の数を数える
-
05-07-2019 - |
質問
SQL Server 2005では、行を削除し、実際に削除された行数を通知する方法はありますか?
同じ条件で select count(*)
を実行できますが、これを完全に信頼できるものにする必要があります。
最初の推測は、 @@ ROWCOUNT
変数を使用することでしたが、設定されていません。
delete
from mytable
where datefield = '5-Oct-2008'
select @@ROWCOUNT
常に0を返します。
MSDNは、 OUTPUT
の構築を提案しています。 、例えば
delete from mytable
where datefield = '5-Oct-2008'
output datefield into #doomed
select count(*)
from #doomed
これは実際には構文エラーで失敗します。
アイデアはありますか?
解決
SET NOCOUNT OFF
を試しましたか?
他のヒント
SQL2000では、この正確な目的で@@ ROWCOUNTを問題なく使用しています。ただし、チェックする前にこのカウントを誤ってリセットしていないことを確認してください(BOL: 'この変数は、IFステートメントなど、行を返さないステートメントによって0に設定されます')。
これを実行するだけです:
SET NOCOUNT off ;
SELECT @p1 = @@ROWCOUNT
p1は、ストアドプロシージャで設定した出力パラメーターです。 役に立てば幸いです。
この例では、 @@ ROWCOUNT
が機能するはずです。これは、削除された行の数を見つける適切な方法です。アプリケーションから何かを削除する場合は、 SET NOCOUNT ON
MSDN によれば、@@ ROWCOUNT関数はSETでも更新されます SET NOCOUNT
は実行後に表示されるメッセージにのみ影響するため、NOCOUNTはオンです。
したがって、たとえばADO.NETからの @@ ROWCOUNT
の結果を処理しようとする場合、 SET NOCOUNT ON
が間違いなく役立ちます。
合計数ではなく、削除された値の個別の数を知りたい場合など、 @@ rowcount
を使用できない場合が見つかりました。この場合、次のことを行う必要があります。
delete from mytable
where datefield = '5-Oct-2008'
output deleted.datefield into #doomed
select count(distinct datefield)
from #doomed
OPの構文エラーは、 output
に datefield
フィールド名の前に deleted
が含まれていなかったためです。
好奇心から、どのようにプロシージャを呼び出していますか? (私はそれがストアドプロシージャであると仮定していますか?)。私が尋ねる理由は、ストアドプロシージャの戻り値(この場合は0)と、行セットの結果(この場合は単一の列と単一の行)の間に違いがあるためです。 ADO.Netでは、前者はパラメーターによってアクセスされ、後者はSqlDataReaderを使用してアクセスされます。おそらく、プロシージャの戻り値を行カウントと間違えていますか?
1つの列idで一時テーブルを作成します。
削除するIDを選択して一時テーブルに挿入します。それはあなたにカウントを与えます。
IDが含まれるテーブルから削除(一時テーブルからIDを選択)