web-dev-qa-db-ja.com

ストアドプロシージャの影響を受けるレコードの数を取得するにはどうすればよいですか?

データベースに対して直接実行されるINSERTUPDATEおよびDELETE SQLステートメントの場合、ほとんどのデータベースプロバイダーは影響を受ける行の数を返します。ストアドプロシージャの場合、影響を受けるレコードの数は常に-1です。

ストアドプロシージャの影響を受けるレコードの数を取得するにはどうすればよいですか?

83
dthrasher

ストアドプロシージャの出力パラメーターを登録し、SQL Serverを使用している場合は@@ROWCOUNTに基づいて値を設定します。 Oracleを使用している場合は、SQL%ROWCOUNTを使用します。

複数のINSERT/UPDATE/DELETEがある場合、各操作の@@ROWCOUNTからの結果を保存する変数が必要になることに注意してください。

79
OMG Ponies

@@RowCountは、SQLステートメントの影響を受けるレコードの数を示します。

@@RowCountは、すぐに発行した場合にのみ機能します。したがって、エラーをトラップする場合は、同じ行でそれを行う必要があります。あなたがそれを分割すると、あなたが2番目に置いたものを逃します。

SELECT @NumRowsChanged = @@ROWCOUNT, @ErrorCode = @@ERROR

複数のステートメントがある場合、各ステートメントの影響を受ける行の数をキャプチャして、それらを合計する必要があります。

SELECT @NumRowsChanged = @NumRowsChanged  + @@ROWCOUNT, @ErrorCode = @@ERROR
44
Raj More

SET NOCOUNT ONがストアドプロシージャスクリプトで設定され(SQL Server Management Studioのデフォルト)、SqlCommand.ExecuteNonQuery();は常に-1を返しました。

SET NOCOUNT OFFを使用せずに、@@ROWCOUNTをオフにしました。

詳細はここにあります: SqlCommand.ExecuteNonQuery()はInsert/Update/Deleteを実行すると-1を返します

29
Dude Pascalou

Microsoft SQL Serverの場合、@@ROWCOUNT変数を返して、ストアドプロシージャの最後のステートメントの影響を受ける行の数を返すことができます。

8
Bob Mc
5
Fredou