Transact-SQL 編程語言提供了一些 SET 語句,這些語句可以更改特定信息的當前會話處理。 SET 語句可分為下表中列出的幾個類別。
有關使用 SET 語句設置局部變量的信息,請參閱 SET @local_variable (Transact-SQL)。
類別 | 語句 |
---|---|
日期和時間語句 | SET DATEFIRST SET DATEFORMAT |
鎖定語句 | SET DEADLOCK_PRIORITY SET LOCK_TIMEOUT |
雜項語句 | SET CONCAT_NULL_YIELDS_NULL SET CURSOR_CLOSE_ON_COMMIT SET FIPS_FLAGGER SET IDENTITY_INSERT SET LANGUAGE SET OFFSETS SET QUOTED_IDENTIFIER |
查詢執行語句 | SET ARITHABORT SET ARITHIGNORE SET FMTONLY 請注意:此功能處於維護模式並且可能會在 Microsoft SQL Server 將來的版本中被刪除。 請避免在新的開發工作中使用該功能,並着手修改當前還在使用該功能的應用程序。 SET NOCOUNT SET NOEXEC SET NUMERIC_ROUNDABORT SET PARSEONLY SET QUERY_GOVERNOR_COST_LIMIT SET RESULT_SET_CACHING(預覽版) 注意:此功能僅適用於 Azure SQL 數據倉庫。 SET ROWCOUNT SET TEXTSIZE |
ISO 設置語句 | SET ANSI_DEFAULTS SET ANSI_NULL_DFLT_OFF SET ANSI_NULL_DFLT_ON SET ANSI_NULLS SET ANSI_PADDING SET ANSI_WARNINGS |
統計語句 | SET FORCEPLAN SET SHOWPLAN_ALL SET SHOWPLAN_TEXT SET SHOWPLAN_XML SET STATISTICS IO SET STATISTICS XML SET STATISTICS PROFILE SET STATISTICS TIME |
事務語句 | SET IMPLICIT_TRANSACTIONS SET REMOTE_PROC_TRANSACTIONS SET TRANSACTION ISOLATION LEVEL SET XACT_ABORT |
使用 SET 語句時的注意事項
-
在執行過程中或運行時運行的所有 SET 語句,除了在分析時運行的這些語句之外:
- SET FIPS_FLAGGER
- SET OFFSETS
- SET PARSEONLY
- 和 SET QUOTED_IDENTIFIER
-
如果是在存儲過程或觸發器中運行 SET 語句,則存儲過程或觸發器返回控制后,將恢復 SET 選項的值。 同樣,如果是在使用 sp_executesql 或 EXECUTE 運行的動態 SQL 字符串中指定 SET 語句,則從在動態 SQL 字符串中指定的批處理返回控制后,將恢復 SET 選項的值 。
-
存儲過程使用執行時指定的 SET 設置執行,但 SET ANSI_NULLS 和 SET QUOTED_IDENTIFIER 除外。 指定 SET ANSI_NULLS 或 SET QUOTED_IDENTIFIER 的存儲過程使用創建存儲過程時指定的設置。 如果在存儲過程內使用任何 SET 設置,則該設置將被忽略。
-
sp_configure 的 user options 設置允許服務器范圍的設置,並可以跨多個數據庫運行 。 此設置的行為還類似於顯式 SET 語句,只是后者發生在登錄時。
-
使用 ALTER DATABASE 設置的數據庫設置僅在數據庫級有效,並且僅在顯式設置時有效。 數據庫設置優先於使用 sp_configure 設置的實例選項設置 。
-
如果 SET 語句使用 ON 和 OFF 時,則可為一個語句指定多個 SET 選項。
備注
這不適用與統計相關的 SET 選項。
例如,
SET QUOTED_IDENTIFIER, ANSI_NULLS ON
可將 QUOTED_IDENTIFIER 和 ANSI_NULLS 設置為 ON。 -
SET 語句設置優先於使用 ALTER DATABASE 設置的等價數據庫選項設置。 例如,SET ANSI_NULLS 語句中指定的值將覆蓋 ANSI_NULL 的數據庫設置。 此外,如果用戶在連接到數據庫時依據的值是因為先前使用 sp_configure user options 設置而生效的,或者所依據的值適用於所有 ODBC 和 OLE/DB 連接,則一些連接設置將自動設置為 ON 。
-
ALTER、CREATE 和 DROP DATABASE 語句不提供 SET LOCK_TIMEOUT 設置。
-
當全局或快捷 SET 語句設置多個設置時,發出快捷 SET 語句后,將重設所有受該快捷 SET 語句影響的選項的先前設置。 如果在發出快捷 SET 語句后設置了受快捷 SET 語句影響的 SET 選項,則該單個 SET 語句將覆蓋相應的快捷設置。 快捷 SET 語句的示例將為 SET ANSI_DEFAULTS。
-
使用批處理時,數據庫上下文由使用 USE 語句建立的批處理決定。 在存儲過程的外部運行的以及批處理中的計划外查詢和所有其他語句,將繼承通過 USE 語句建立的數據庫和連接的選項設置。
-
多個活動的結果集 (MARS) 請求共享一個全局狀態,該狀態包含最新會話 SET 選項設置。 每個請求執行時都可以修改 SET 選項。更改特定於設置這些更改所在的請求上下文,不影響其他並發 MARS 請求。 但是,請求執行完成后,新的 SET 選項會被復制到全局會話狀態。 在此更改之后,同一會話中執行的新請求將使用這些新的 SET 選項設置。
-
當從批處理或其他存儲過程運行某個存儲過程時,運行該存儲過程時使用的選項值,就是在包含該存儲過程的數據庫中設置的選項值。 例如,存儲過程 db1.dbo.sp1 調用存儲過程 db2.dbo.sp2 時,執行存儲過程 sp1 時將使用數據庫 db1 的當前兼容級別設置,執行存儲過程 sp2 時將使用數據庫 db2 的當前兼容級別設置 。
-
如果 Transact-SQL 語句關注的對象駐留在多個數據庫中,則將對該語句應用當前數據庫上下文和當前連接上下文。 在這種情況下,如果 Transact-SQL 語句在批處理中,則當前連接上下文是 USE 語句定義的數據庫;如果 Transact-SQL 語句在存儲過程中,則連接上下文是包含該存儲過程的數據庫。
-
針對計算列或索引視圖創建並操作索引時,必須將這些 SET 選項設置為 ON:ARITHABORT、CONCAT_NULL_YIELDS_NULL、QUOTED_IDENTIFIER、ANSI_NULLS、ANSI_PADDING 和 ANSI_WARNINGS。 將選項 NUMERIC_ROUNDABORT 設置為 OFF。
如果未將以上任一選項設置為要求的值,則對索引視圖或帶計算列索引的表進行 INSERT、UPDATE、DELETE、DBCC CHECKDB 和 DBCC CHECKTABLE 操作時將失敗。 SQL Server 將發出一個錯誤,並列出所有設置不正確的選項。 同時,SQL Server 將對這些表或索引視圖運行 SELECT 語句,就好像計算列或視圖中不存在索引。
-
如果 SET RESULT_SET_CACHING 設置為 ON,它為當前客戶端會話啟用結果集緩存功能。 如果已在數據庫級別將 Result_set_caching 設置為 OFF,就無法為會話將它設置為 ON。 如果 SET RESULT_SET_CACHING 設置為 OFF,它為當前客戶端會話禁用結果集緩存功能。 必須有公共角色的成員身份,才能更改此設置。 適用對象:Azure SQL 數據倉庫 Gen2