質問

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を選択)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top