共用方式為


SET 陳述式 (Transact-SQL)

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