影響結果的 SET 選項

索引檢視與計算資料行上的索引會將結果儲存在資料庫中,以供日後參考。只當所有參考索引檢視或索引計算資料行的連接和建立索引之連接可以產生相同的結果集,儲存的結果才會有效。為確保儲存的結果能夠正確維護並傳回一致的結果,若有下列動作發生,則需將下表中的 SET 選項設為 [必要值] 欄位中的顯示值:

  • 在檢視或計算資料行上建立了索引。

  • 定義了計算資料行並指定 PERSISTED。

  • INSERT、UPDATE 或 DELETE 作業修改了索引檢視或索引計算資料行中所儲存的資料值。這包括 BCP、DTS、複寫與分散式查詢等作業。

  • 查詢最佳化工具使用了查詢執行計畫中的索引。

  • 針對索引檢視,因為 ANSI_NULLS 與 QUOTED_IDENTIFIER 選項會儲存於檢視中繼資料內,所以在建立檢視時這兩個設定必須設為 ON。

    SET 選項

    必要值

    預設的伺服器值

    預設

    OLE DB 與 ODBC 值

    預設

    DB-Library 值

    ANSI_NULLS

    ON

    OFF

    ON

    OFF

    ANSI_PADDING

    ON

    ON

    ON

    OFF

    ANSI_WARNINGS*

    ON

    OFF

    ON

    OFF

    ARITHABORT

    ON

    ON

    OFF

    OFF

    CONCAT_NULL_YIELDS_NULL

    ON

    OFF

    ON

    OFF

    NUMERIC_ROUNDABORT

    OFF

    OFF

    OFF

    OFF

    QUOTED_IDENTIFIER

    ON

    OFF

    ON

    OFF

    * 當資料庫的相容性層級設定為 90 或以上時,將 ANSI_WARNINGS 設定為 ON 會將 ARITHABORT 隱含設定為 ON。如果資料庫的相容性層級設定為 80 或更低,ARITHABORT 選項就必須明確地設定為 ON。

當 SET 選項設定錯誤時,會產生下列的一或多種情形:

  • Database Engine 會產生錯誤,並對變更索引中所儲存之資料值的任何 INSERT、UPDATE 或 DELETE 陳述式進行回復。

  • 查詢最佳化工具不會考量任何 Transact-SQL 陳述式之執行計畫中的索引。

  • 無法建立索引檢視或計算資料行。

OLE DB 與 ODBC 連接的 SET 選項設定

大部分的應用程式都會使用 SQL Server OLE DB Provider 或 SQL Server ODBC 驅動程式,來連接含有 SQL Server Management Studio、Integration Services、複寫,以及大量複製作業的 SQL Server 執行個體。對於檢視或計算資料行上之索引所需的六個 SET 選項而言,OLE DB 與 ODBC 預設值是正確的。如需 OLE DB 與 ODBC 的預設值,請參閱先前的表格。這些設定會強制執行 ISO 標準的規則,而且是 SQL Server 的建議設定。如需詳細資訊,請參閱<用戶端網路組態>。

[!附註]

有些 SQL Server 公用程式會將一或多個 ANSI 設定設為 OFF,以維持與舊版公用程式的相容性。

DB-Library 與 Embedded SQL for C 連接的 SET 選項設定

根據預設,DB-Library 與 Embedded SQL for C 應用程式不會設定任何工作階段選項。使用這些 API 的系統必須編寫應用程式以發出適當的 SET 陳述式,或是將資料庫或伺服器的預設值變更為正確的設定。

設定選項的優先順序

SET 選項的 ON 或 OFF 設定,可在數個層級上指定。每個工作階段選項的最終設定,是由設定該選項的作業當中優先順序最高者來決定。以下列出工作階段設定作業的優先順序,最優先者列於清單的頂端:

  • 在應用程式連接到伺服器之後,應用程式可以藉由執行 SET 陳述式來明確覆寫任何預設值。SET 陳述式可覆寫所有先前的設定,並在應用程式執行時動態開啟或關閉選項。這些選項設定僅適用於目前的連接工作階段。

  • OLE DB 與 ODBC 應用程式可以在連接字串中指定選項設定,來指定連接期間作用的選項設定。這些選項設定僅適用於目前的連接工作階段。

  • 使用 [控制台] 中的 ODBC 應用程式或 ODBC SQLConfigDataSource 函數,為 SQL Server ODBC 資料來源指定的 SET 選項。

  • 資料庫的預設值。您可以使用 ALTER DATABASE 或 SQL Server Management Studio 中的 [物件總管] 以指定這些值。

  • 伺服器的預設值。您可以使用 sp_configure 或 SQL Server Management Studio 中的 [物件總管] 來指定這些值,以設定名為 user options 的伺服器組態選項。

舉例來說,雖然 ANSI_NULLS 的 ODBC 預設值為 ON,但您可以在 ODBC 連接中或是在連接到資料庫之後使用 SET 陳述式,將該選項設為 OFF。

預存程序和觸發程序

您應該撰寫預存程序與觸發程序,使其能與支援檢視索引和計算資料行之索引所需的六個 SET 選項搭配運作。當 SET 選項未正確設定時,查詢最佳化工具將無法在預存程序或觸發程序所執行的 SELECT 陳述式中使用檢視或計算資料行的索引。使用預存程序或觸發程序中的 INSERT、UPDATE 或 DELETE 陳述式來修改索引檢視或計算資料行中儲存的資料值,會產生錯誤。

考量因素

SET 陳述式可以動態變更工作階段選項。因此,在包含檢視索引和索引計算資料行的資料庫中發出 SET 陳述式時要小心進行。例如,應用程式在建立連接時預設為允許參照索引檢視或索引計算資料行;不過,若該連接所呼叫的預存程序或觸發程序使用的第一個陳述式為 SET ANSI_WARNINGS OFF,則此陳述式會覆寫 ANSI_WARNINGS 先前的預設值或設定。在此情況下,最佳化工具在處理預存程序或觸發程序中的任何陳述式時,會忽略所有的索引檢視或索引計算資料行。

其他三個工作階段選項也可能影響結果集的格式:DATEFIRST、DATEFORMAT 與 LANGUAGE。可能因為這些選項變更而使其結果受到影響的任何函數,將歸類為非決定性,而且無法用於索引檢視或索引計算資料行中。