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


86

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

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


1
カウントなしも私の問題でした。テストするには、Management Studioでストアドプロシージャを実行し、カウントが得られるかどうかを確認します。得られる場合は、出力変数があることを確認します。
user2624356 2013

回答:


80

ストアドプロシージャのoutパラメータを登録し、SQLServerを@@ROWCOUNT使用しているかどうかに基づいて値を設定します。SQL%ROWCOUNTOracleを使用している場合に使用します。

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


46

@@RowCount SQLステートメントの影響を受けるレコードの数がわかります。

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

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

複数のステートメントがある場合は、それぞれに影響を受ける行の数を取得して、それらを合計する必要があります。

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

33

私のために判明SET NOCOUNT ON(SQL Server Management Studioのデフォルトではオン)ストアドプロシージャスクリプトで設定としてSqlCommand.ExecuteNonQuery();常に返さ-1。

私はそれをオフに設定しました:SET NOCOUNT OFFを使用する必要はありません@@ROWCOUNT

詳細はこちら:SqlCommand.ExecuteNonQuery()は、挿入/更新/削除を実行すると-1を返します


これは私にとってはうまくいきます。私のストアドプロシージャは単純な挿入ステートメントであり、機能しているようです。ありがとう!
Harvey Darvey 2013

ありがとう!参照で良い仕事。
レオガーディアン2016年

8

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



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.