2011-12-20 3 views
17

特定のレコードを削除するストアドプロシージャがあります。私は削除されたレコードの数を取得する必要があります。削除されたレコードの数はどのように取得できますか?

私はこのようにそれを実行しようとしました:

DELETE FROM OperationsV1.dbo.Files WHERE FileID = @FileID 
SELECT @@ROWCOUNT AS DELETED;    

しかし、適切なレコードが削除されたもののDELETEDは、0として示されています。私はSET NOCOUNT OFFを試しました。成功なし。助けてもらえますか?おかげさまで

+1

あなたは '@@ ROWCOUNT'から取得した値で何をしますか?あなたはそれを返すしたいですか? 'DECLARE @DeleteCnt INT;を使う必要があります。 SELECT @DeleteCnt = @@ ROWCOUNT'を使用して値を変数に取り込み、それを監査テーブルなどに戻したり挿入したりすることができます。 –

答えて

24

正常に動作するはずです。 NOCOUNTの設定は無関係です。

表示されている2つの間に声明がありますか? @@ROWCOUNTはすべてのステートメントの後にリセットされるため、介入するステートメントなしですぐに値を取得する必要があります。

+0

いいえ、間には何もありません。 –

+0

これはどのようにテストしていますか? Management Studioでは? –

+5

申し訳ありませんが、私の間違いでした。 SELECT @@ ROWCOUNTをDELETEDとします。間違った削除ステートメントの後。 –

-5
START TRANSACTION; 
SELECT @before:=(SELECT count(*) FROM OperationsV1.dbo.Files); 
DELETE FROM OperationsV1.dbo.Files WHERE FileID = @FileID; 
SELECT @after:=(SELECT count(*) FROM OperationsV1.dbo.Files); 
COMMIT; 
SELECT @[email protected] AS DELETED; 

私は、SQLサーバーについて知っているが、MySQL SELECT count(*) FROM ...で極めて安価操作ではありません。 DELETEなどの操作後にカウントを確認するためにストアドプロシージャを、デバッグ時

+0

ありがとうEugen。 @@ ROWCOUNTがなぜ私にとってうまくいかないのか誰かが説明できるかどうかを見てみましょう。 @@ ROWCOUNTで誰も助けなければ、あなたのソリューションを使用します。 –

+2

デフォルトのトランザクション分離レベルでは、これにより、このクエリの途中でカウントを変更する別の削除が引き続き許可されます。 – Andomar

+7

@David - これを使わないでください。これは高価で競争条件があります。 –

1

私はこのコードスニペットを使用します。

DELCARE @Msg varchar(30) 
... 
SELECT @Msg = CAST(@@ROWCOUNT AS VARCHAR(10)) + ' rows affected' 
RAISERROR (@Msg, 0, 1) WITH NOWAIT 
関連する問題