SET 陳述式 (Transact-SQL)
Transact-SQL 程式設計語言提供了許多 SET 陳述式,供您變更目前工作階段對於特定資訊的處理。 這些 SET 陳述式可分組成下表所顯示的類別目錄。
如需有關使用 SET 陳述式來設定區域變數的詳細資訊,請參閱<SET @local\_variable (Transact-SQL)>。
類別目錄 |
陳述式 |
---|---|
日期和時間陳述式 |
|
鎖定陳述式 |
|
其他陳述式 |
|
查詢執行陳述式 |
注意 未來的 Microsoft SQL Server 版本將移除這項功能。請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。 |
ISO 設定陳述式 |
|
統計資料陳述式 |
|
交易陳述式 |
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 所設定的執行個體選項設定。
對於任何含有 ON 和 OFF 設定的 SET 陳述式,您都可以指定多個 SET 選項的 ON 或 OFF 設定。
注意
這並不適用於與統計資料相關的 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 ANSI_DEFAULTS) 設定多項設定時,發出捷徑 SET 陳述式會重設捷徑 SET 陳述式影響所及的所有選項先前的設定。 如果在發出捷徑 SET 陳述式之後,才明確設定捷徑 SET 陳述式影響所及的個別 SET 選項,這個個別 SET 陳述式會覆寫對應的捷徑設定。
當使用批次時,資料庫內容取決於利用 USE 陳述式建立的批次。 隨選查詢和在預存程序之外執行以及在批次中的所有其他陳述式,都繼承 USE 陳述式所建立之資料庫和連接的選項設定。
Multiple Active Result Set (MARS) 要求會共用包含最新工作階段 SET 選項設定的全域狀態。 當執行各項要求時,它都能夠修改 SET 選項。 變更專屬於設定它們的要求內容,不會影響其他並行 MARS 要求。 不過,在要求執行完成之後,會將新的 SET 選項複製到全域工作階段狀態中。 在這項變更之後,相同工作階段所執行的新要求會使用這些新的 SET 選項設定。
當執行預存程序時,不論是從批次執行,或另一個預存程序執行,都會利用這個預存程序所在資料庫中目前所設定的選項值來執行。 例如,當 db1.dbo.sp1 預存程序呼叫 db2.dbo.sp2 預存程序時,會利用 db1 資料庫目前的相容性層級設定來執行 sp1 預存程序,利用 db2 資料庫目前的相容性層級設定來執行 sp2 預存程序。
當 Transact-SQL 陳述式參考在多個資料庫中的物件時,這個陳述式會套用目前的資料庫內容及目前的連接內容。 在這個情況下,如果 Transact-SQL 陳述式是在批次中,目前的連接內容就是 USE 陳述式所定義的資料庫;如果 Transact-SQL 陳述式是在預存程序中,連接內容就是預存程序所在的資料庫。
當您建立和操作計算資料行索引或索引檢視時,ARITHABORT、CONCAT_NULL_YIELDS_NULL、QUOTED_IDENTIFIER、ANSI_NULLS、ANSI_PADDING 和 ANSI_WARNINGS 等 SET 選項都必須設成 ON。 NUMERIC_ROUNDABORT 選項必須設成 OFF。
如果任何這些選項未設成所需要的值,在索引檢視或含計算資料行索引的資料表上執行 INSERT、UPDATE、DELETE、DBCC CHECKDB 和 DBCC CHECKTABLE 動作都會失敗。 SQL Server 會產生一個錯誤,列出所有設定不正確的選項。 另外,SQL Server 也會依照計算資料行或檢視的索引並不存在的方式,來處理這些資料表或索引檢視的 SELECT 陳述式。