首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server SET NOCOUNT 詳細用法、效能影響與觸發器陷阱

     編輯:關於SqlServer

基本語法與行為

SET NOCOUNT ON  -- 關閉「受影響行數」訊息傳回客戶端
SET NOCOUNT OFF -- 開啟 (預設)
  • ON 時,不發送 DONE_IN_PROC 封包,查詢工具不顯示 (n rows affected)。
  • @@ROWCOUNT 函數仍正常更新,不受影響。
  • 設定於執行階段生效,非剖析階段。

效能優勢

預存程序包含多條不回傳結果集的陳述式 (INSERT/UPDATE/DELETE/SET) 時,關閉行數訊息可大幅減少網路封包,提升高延遲網路下的吞吐量。

兩大實戰陷阱

1. OLE DB vs ODBC 記錄集差異

  • ODBC 驅動會自動過濾「無欄位記錄集」(如 CREATE TABLE, INSERT 產生的行數封包)。
  • OLE DB (ADODB.Recordset) 不會過濾,導致 NextRecordset 邏輯錯誤,誤以為有結果集返回。
  • 對策:在預存程序開頭加 SET NOCOUNT ON,消除雜訊封包。

2. 觸發器回傳結果集導致錯誤

觸發器內若有 SELECT 或變數賦值 (@var = ...) 會產生結果集,導致呼叫端 (如 ADO) 收到多重結果集,刪除多筆資料時拋出:

Key column information is insufficient or incorrect. Too many rows were affected by update.

對策:觸發器開頭務必加 SET NOCOUNT ON;嚴禁在觸發器輸出任何結果。

最佳實務

  1. 所有預存程序、觸發器、批次腳本開頭統一加 SET NOCOUNT ON。
  2. 僅在需向客戶端回傳行數的診斷腳本中使用 OFF。
  3. 搭配 SET ANSI_NULLS ON, SET QUOTED_IDENTIFIER ON 形成標準模板。

養成 SET NOCOUNT ON 習慣,能避開 80% 的「多重結果集」與網路效能問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved