2009-06-15 5 views
16

私はSQL Server 2008データベースにストアドプロシージャを作成しています。私は影響を受ける行の数を返したい。何が良いオプションですSET NOCOUNT OFFまたは@ ROWCOUNTを返しますか?SET NOCOUNT OFFまたは@ ROWCOUNTを返しますか?

ALTER PROCEDURE [dbo].[MembersActivateAccount] 
    @MemberId uniqueidentifier 
AS 
BEGIN 
    -- Should I use this? 
    SET NOCOUNT OFF; 

    UPDATE [dbo].Members SET accountActive = 1 WHERE id = @MemberId; 
    --Or should I SET NOCOUNT ON and use the following line instead? 
    --return @@ROWCOUNT; 
END 

私は両方の仕事が良い選択であり、その理由は分かっていますか?


私は、SET NOCOUNTがデフォルトでストアドプロシージャ内でOFFになっているという結論に至りました。私のデータベース内でこの動作を変更することは可能ですか?

答えて

23

@@ RowCountを使用します。明示的かつ透過的です。ビルトインのビヘイビアーではなく、コードによって完全に制御されます。

NOCOUNTオプションは、デフォルトでON(Optons> Query Execution> SQL Server> Advanced)に手動で設定できます。この方法で設定したが、ストアドプロシージャでSET NOCOUNT OFFを宣言すると、そのローカル設定が優先されます。

4

SET NOCOUNTをONにすると、DataAdapterは並行性の競合が発生していると判断します。

read about it on MSDNとすることができます。コードがDataAdaptersで使用される場合は、明らかにSET NOCOUNT ONを使用しないでください。

SqlCommand also has this behaviourのように見えますが、DataAdapterに問題があると思います(Commandオブジェクトを使用するように)。

+0

SqlCommandのドキュメント内でSET NOCOUNTについて何も言及していません。 DataAdaptersと同じ問題があることは確かですか? – niaher

+1

Googleにはそれがあるという証拠がたくさんあります:http://www.google.co.uk/search?client=firefox-a&rls=org.mozilla%3Aen-GB%3Aofficial&channel=s&hl=en&q=ExecuteNonQuery+ NoCount&meta =&btnG = Google +検索。私はそれをテストせずにDataAdaptersと同じ問題であるとは確信できませんが、別の理由があるのはなぜか分かりません。 – RichardOD

5

値にRETURNを使用しないでください。通常、ストアドプロシージャのRETURNはエラーコードを意味し、0はエラーを意味し、0以外は何らかの問題を意味します。データを戻す必要がある場合は、OUTPUTパラメータを使用してデータを適切に保存します。これは、他の言語のリターンの使用に基づいて、やや直感的ではありません。 SET NOCOUNT ON/OFFを使用する

+0

これには理由があります:最後にチェックしましたが、戻り値はshortint値に制限されています。つまり、返される最大値は65535です。 – enorl76

2

理由:

任意のテーブルに行を挿入しながら、スタックオーバーフローを制御します。 クエリまたはネストされたクエリの実行中にT-SQLメッセージを渡す。 実行された最新のクエリを表示または表示する。 最新のレコードエスカレーションに関する情報を取得する。

0

は、なぜ私たちは/オフ---

アンス上のSET NOCOUNTを使用します。私たちは、次の手順

ステップ1でこのことを理解することができますクエリを実行「を選択し、トップ10 *テーブル名から」 。

ステップ2:メッセージウィンドウを開くと、「影響を受ける10行」というメッセージが表示されます。余分なオーバーヘッドが発生し、実行時間が長くなります。

ステップ3:この余分なオーバーヘッドを克服するために、SET NOCOUNT ONを使用します。 Onの場合、行の戻り値の数は決してカウントされません。代わりに、正常に完了したメッセージ・コマンドが表示されます。

ステップ4:デフォルトでNOCOUNTがONの場合、データベースサーバーからのパフォーマンスを向上させるために、新しいプロシージャを作成するときにオフにしなければならないという私の提案が返される行の数がカウントされます。

関連する問題