共用方式為


SET (Transact-SQL)

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_configureuser 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 陳述式。