SET 命令控制目前會話的行為選項,影響查詢語意、效能、錯誤處理與相容性。掌握關鍵 SET 選項是 T-SQL 開發者的必修課。
| 分類 | 選項 | 預設值 | 影響範圍與說明 |
|---|---|---|---|
| ANSI 標準相容 | ANSI_NULLS | ON | ON 時 = NULL 為 FALSE,需用 IS NULL;建立索引檢視/計算欄索引/篩選索引必須 ON |
| ANSI_PADDING | ON | 控制 char/varchar/binary/varbinary 尾端空白/零填補;建立索引必須 ON | |
| ANSI_WARNINGS | ON | 截斷、除零、算術溢位是否報錯;建立索引必須 ON | |
| ANSI_NULL_DFLT_ON / OFF | ON | 未指定 NULL/NOT NULL 時預設可為 NULL | |
| QUOTED_IDENTIFIER | ON | 雙引號識別碼、單引號字串;建立索引檢視/計算欄索引/篩選索引/XML 索引必須 ON | |
| CONCAT_NULL_YIELDS_NULL | ON | NULL + 'str' 結果為 NULL;未來版本將永遠 ON | |
| 數值運算 | ARITHABORT | ON | 查詢最佳化器相依;除零/溢位中止批次;建立索引必須 ON |
| ARITHIGNORE | OFF | 忽略溢位/除零錯誤(不推薦) | |
| NUMERIC_ROUNDABORT | OFF | 精度遺失是否報錯;建立索引必須 OFF | |
| FIRE_TRIGGERS | ON | 是否觸發觸發器(僅限 sa / db_owner) | |
| 查詢執行 | NOCOUNT | OFF | ON 時不回傳「受影響資料列數」訊息,大幅減少網路往返,ADO/.NET 必開 |
| ROWCOUNT | 0 (無限制) | 限制後續陳述式影響/回傳最大列數 | |
| TEXTSIZE | 2147483647 | text/ntext/image 最大回傳位元組數 | |
| FORCEPLAN | OFF | 強制依 FROM 表順序聯結(極少用) | |
| STATISTICS IO / TIME / PROFILE / XML | OFF | 效能分析輸出開關 | |
| 游標與交易 | CURSOR_CLOSE_ON_COMMIT | OFF | ON 時 COMMIT/ROLLBACK 自動關閉游標 |
| IMPLICIT_TRANSACTIONS | OFF | ON 時自動開啟交易(ANSI 模式) | |
| XACT_ABORT | OFF | ON 時執行錯誤自動回滾整個交易(強烈建議 ON) | |
| REMOTE_PROC_TRANSACTIONS | ON | 遠端預存程序是否列入本地交易 | |
| 日期與語言 | DATEFIRST | 7 (美式/週日) | 每週第一天 (1=週一..7=週日) |
| DATEFORMAT | mdy | 日期解析順序 (mdy/dmy/ymd 等) | |
| LANGUAGE | us_english | 系統訊息、日期名稱語言 |
ANSI_NULLS ON、QUOTED_IDENTIFIER ON、ANSI_PADDING ON、ANSI_WARNINGS ON、ARITHABORT ON、CONCAT_NULL_YIELDS_NULL ON、NOCOUNT ON、XACT_ABORT ON、NUMERIC_ROUNDABORT OFFIMPLICIT_TRANSACTIONS OFF、ARITHIGNORE OFF、FORCEPLAN OFF每個 SELECT/INSERT/UPDATE/DELETE 預設回傳「(N row(s) affected)」。高頻呼叫預存程序時,關閉此訊息可減少 5-10% 網路開銷與用戶端處理。
執行階段錯誤(如主鍵衝突、轉換失敗、逾時)自動回滾整個交易,避免部分提交導致資料不一致。配合 TRY...CATCH 使用最佳。
查詢最佳化器假設此選項 ON 產生計畫。若連線層級 OFF,可能產生次佳計畫導致效能劇降。連線字串建議明確指定。
SET 選項不只是開關,更是查詢語意契約。建立連線時明確設定基準組合、預存程序開頭重申關鍵選項、避免隱性相依,是穩定高效 T-SQL 的基石。