データベースに対して直接実行されるINSERT
、UPDATE
およびDELETE
SQLステートメントの場合、ほとんどのデータベースプロバイダーは影響を受ける行の数を返します。ストアドプロシージャの場合、影響を受けるレコードの数は常に-1
です。
ストアドプロシージャの影響を受けるレコードの数を取得するにはどうすればよいですか?
ストアドプロシージャの出力パラメーターを登録し、SQL Serverを使用している場合は@@ROWCOUNT
に基づいて値を設定します。 Oracleを使用している場合は、SQL%ROWCOUNT
を使用します。
複数のINSERT/UPDATE/DELETE
がある場合、各操作の@@ROWCOUNT
からの結果を保存する変数が必要になることに注意してください。
@@RowCount
は、SQLステートメントの影響を受けるレコードの数を示します。
@@RowCount
は、すぐに発行した場合にのみ機能します。したがって、エラーをトラップする場合は、同じ行でそれを行う必要があります。あなたがそれを分割すると、あなたが2番目に置いたものを逃します。
SELECT @NumRowsChanged = @@ROWCOUNT, @ErrorCode = @@ERROR
複数のステートメントがある場合、各ステートメントの影響を受ける行の数をキャプチャして、それらを合計する必要があります。
SELECT @NumRowsChanged = @NumRowsChanged + @@ROWCOUNT, @ErrorCode = @@ERROR
SET NOCOUNT ON
がストアドプロシージャスクリプトで設定され(SQL Server Management Studioのデフォルト)、SqlCommand.ExecuteNonQuery();
は常に-1を返しました。
SET NOCOUNT OFF
を使用せずに、@@ROWCOUNT
をオフにしました。
詳細はここにあります: SqlCommand.ExecuteNonQuery()はInsert/Update/Deleteを実行すると-1を返します
Microsoft SQL Serverの場合、@@ROWCOUNT
変数を返して、ストアドプロシージャの最後のステートメントの影響を受ける行の数を返すことができます。