通過this question那裏有關於SET NOCOUNT不同觀點的啓發......SET NOCOUNT ON使用
我們應該使用SET NOCOUNT ON的SQL Server?如果不是,爲什麼不呢?
它編輯6什麼,在2011年7月22日
它抑制任何DML後的 「XX行受到影響」 消息。這是一個結果集,當發送時,客戶端必須處理它。它很小,但可以測量(請參閱下面的答案)
對於觸發器等,客戶端將收到多個「受影響的xx行」,這會導致某些ORM,MS Access,JPA等所有錯誤形式(請參閱下面的編輯)
背景:
一般公認的最佳實踐(我想,直到這個問題)是觸發條件和SQL Server存儲過程使用SET NOCOUNT ON
。我們在任何地方都使用它,並且快速的谷歌顯示了許多SQL Server MVP也同意。
MSDN說這可以打破.net SQLDataAdapter。
現在,這意味着SQLDataAdapter僅限於完全簡單的CRUD處理,因爲它期望「n行受影響」消息匹配。所以,我不能用:
- IF的存在是爲了避免重複(沒有行受影響的消息)注:謹慎使用
- WHERE NOT EXISTS(再少點行預計
- 過濾掉瑣碎的更新(例如,沒有數據實際上改變)
- 之前(如日誌記錄)
- 隱藏複雜性或denormlisation
- 等 做任何訪問表0
在問題marc_s(誰知道他的SQL的東西)說不要使用它。這與我認爲的不同(我也認爲我自己在SQL方面也有點勝任)。
這可能是我錯過了一些東西(隨意指出明顯的),但是你有什麼想法?
注意:我看到這個錯誤已經有好幾年了,因爲我現在不使用SQLDataAdapter。
編輯的意見和問題後:
編輯:更多的想法...
我們有多個客戶端:一個可以使用C#SQLDataAdaptor,另一個可以使用NHibernate的從Java。這些可能會以不同的方式影響SET NOCOUNT ON
。
如果您將存儲的過程視爲方法,那麼假定某些內部處理以某種方式適用於您自己的目的,這是錯誤的形式(反模式)。
編輯2:一個trigger breaking nHibernate question,其中SET NOCOUNT ON
不能設置
(不,它不是this一式兩份)
編輯3:然而,更多的信息,感謝我的MVP同事
- KB 240882,問題在SQL 2000造成斷開和早期
- Demo of performance gain
編輯4:2011 5月13
Breaks Linq 2 SQL too when not specified?
編輯5:2011 14 6
符JPA,存儲過程與表變量:Does JPA 2.0 support SQL Server table variables?
編輯6:2011年8月15日
SSMS「編輯行」數據網格需要SET NOCOUNT ON:Update trigger with GROUP BY
編輯7:2013年3月7日
更深入的細節從@RemusRusanu:
Does SET NOCOUNT ON really make that much of a performance difference
@AlexKuznetsov:什麼是「Threadsafe」方法?在EXISTS中執行的讀取仍然會包含任何未完成的交易? – AnthonyWJones
SET NOCOUNT隻影響「(受影響的#記錄)」消息的顯示,而不影響@@ ROWCOUNT的底層值或數據庫引擎本身。如果EXISTS和WHILE NOT EXISTS將無論如何工作。 –
@Jeremy Seghi:對於遲到的回覆感到抱歉。 (#rows affected)消息是由SSMS等解釋的客戶端工具東西:但是有一個數據包與此信息一起發送。當然,我知道@@ rowcount是如何工作的,但這不是問題的關鍵...... – gbn