SET NOCOUNTについて異なる見解があるこの質問に触発されて ...
SQL ServerにはSET NOCOUNT ONを使用する必要がありますか?そうでない場合、なぜそうではないのですか?
何それがない 2011年7月22日に、編集6
DMLの後に「影響を受けるxx行」メッセージを抑制します。これは結果セットであり、送信時にクライアントはそれを処理する必要があります。小さいですが、測定可能です(以下の回答を参照)
トリガーなどの場合、クライアントは複数の「影響を受けるxx行」を受け取ります。これにより、一部のORM、MS Access、JPAなどであらゆる種類のエラーが発生します(以下の編集を参照)。
バックグラウンド:
一般的に受け入れられているベストプラクティス(この質問までは考えていました)はSET NOCOUNT ON
、SQL Serverのトリガーとストアドプロシージャで使用することです。私たちはどこでもそれを使用し、簡単なグーグルは多くのSQL Server MVPも同意することを示しています。
MSDNは、これが.net SQLDataAdapterを破壊する可能性があると述べています。
これは、SQLDataAdapterが「影響を受ける行数n」のメッセージが一致することを期待しているため、まったく単純なCRUD処理に限定されていることを意味します。だから、私は使用できません:
- 重複を避けるために存在する場合(行はメッセージに影響しません)注:注意して使用してください
- 存在しない場所(予想される行が少ない場合)
- ささいな更新を除外する(たとえば、実際に変更されるデータはない)
- 前にテーブルへのアクセスを行う(ロギングなど)
- 複雑さや正規化を隠す
- 等
marc_s(彼のSQLを知っている人)の質問では、これを使用しないでください。これは私が思うこととは異なります(私もSQLである程度有能であると私は考えています)。
何か不足している可能性があります(明らかなことを自由に指摘してください)が、そこにいる人々はどう思いますか?
注:SQLDataAdapterを最近使用していないため、このエラーが発生してから数年が経ちました。
コメントと質問の後の編集:
編集:その他の考え...
複数のクライアントがあります。1つはC#SQLDataAdaptorを使用し、もう1つはJavaのnHibernateを使用します。これらは、によってさまざまな方法で影響を受ける可能性がありますSET NOCOUNT ON
。
ストアドプロシージャをメソッドと見なす場合、内部処理の一部が独自の目的で特定の方法で機能すると想定することは不適切な形式(アンチパターン)です。
編集2:nHibernateの質問を破るトリガー、SET NOCOUNT ON
設定できない場所
(そして、それはこれの複製ではありません)
編集3:私のMVPの同僚のおかげで、さらに詳しい情報
- KB 240882、SQL 2000以前で切断を引き起こす問題
- パフォーマンス向上のデモ
編集4:2011年5月13日
編集5:2011年6月14日
JPA、テーブル変数を含むストアドプロシージャを壊す:JPA 2.0はSQL Serverテーブル変数をサポートしていますか?
編集6:2011年8月15日
SSMSの「行の編集」データグリッドにはSET NOCOUNT ONが必要です:GROUP BYでトリガーを更新
編集7:2013年3月7日
@RemusRusanuからの詳細:SET NOCOUNT ONは本当にパフォーマンスに大きな違いをもたらします
か