51

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

これは実際には構文エラーで失敗します。

何か案は?

4

7 に答える 7

57

試しましたSET NOCOUNT OFFか?

于 2008-10-06T13:00:46.283 に答える
11

私はSQL2000でこの正確な目的のために@@ROWCOUNTを問題なく使用しています。ただし、チェックする前に、このカウントを誤ってリセットしていないことを確認してください(BOL:'この変数は、IFステートメントなどの行を返さないステートメントによって0に設定されます')。

于 2008-10-06T13:10:44.610 に答える
8

これを行うだけです:

SET NOCOUNT off ;
SELECT @p1 = @@ROWCOUNT

ここで、p1 は、ストアド プロシージャで設定した出力パラメーターです。それが役に立てば幸い。

于 2014-01-11T10:07:15.323 に答える
6

あなたの例@@ROWCOUNTではうまくいくはずです-それは削除された行の数を見つけるための適切な方法です。アプリケーションから何かを削除しようとしている場合は、を使用する必要がありますSET NOCOUNT ON

MSDNによると、 @@ ROWCOUNT関数はSET NOCOUNT、実行後に表示されるメッセージにのみ影響するため、SETNOCOUNTがONの場合でも更新されます。

@@ROWCOUNTしたがって、たとえばADO.NETの結果を処理しようとしている場合は、SET NOCOUNT ON間違いなく役立つはずです。

于 2008-10-06T13:03:56.480 に答える
0

好奇心から、プロシージャをどのように呼び出していますか? (ストアドプロシージャだと思いますか?)。私が尋ねる理由は、ストアド プロシージャの戻り値 (この場合は 0) と行セットの結果 (この場合は単一の列を持つ単一の行) との間に違いがあるためです。ADO.Net では、前者はパラメーターによってアクセスされ、後者は SqlDataReader によってアクセスされます。おそらく、プロシージャの戻り値を行数と間違えていませんか?

于 2008-10-08T15:18:59.717 に答える
-1

1つの列IDを持つ一時テーブルを作成します。

削除するIDを選択して一時テーブルに挿入します。それはあなたにあなたの数を与えます。

idが入っているテーブルから削除します(一時テーブルからidを選択します)

于 2008-10-06T13:00:46.253 に答える