結果に影響を与える SET オプション

インデックス付きビューおよび計算列のインデックスの結果は、後で参照できるようにデータベースに格納されます。格納された結果が有効なのは、インデックス付きビューまたはインデックス付き計算列を参照するすべての接続で、インデックスを作成した接続と同一の結果セットを生成できる場合だけです。格納された結果を正常に保ち一貫性のある結果を返すためには、次に示す状態が発生するたびに、下の表の SET オプションを必要な値列に示した値に設定する必要があります。

  • ビューまたは計算列のインデックスを作成したとき。

  • 計算列を定義して PERSISTED を指定したとき。

  • INSERT、UPDATE、DELETE のいずれかの操作で、インデックス付きビューまたはインデックス付き計算列に格納したデータ値を変更するとき。BCP、DTS、レプリケーション、分散クエリなどの操作もこれに該当します。

  • クエリ オプティマイザーがクエリ実行プランのインデックスを使用するとき。

  • インデックス付きビューの場合、ANSI_NULLS オプションおよび QUOTED_IDENTIFIER オプションがビューのメタデータと共に格納されるので、ビューの作成時にこの 2 つのオプションを 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

    *ANSI_WARNINGS を ON に設定すると、データベース互換性レベルが 90 以上に設定されている場合、暗黙的に ARITHABORT が ON に設定されます。データベース互換性レベルが 80 以下に設定されている場合は、ARITHABORT オプションを明示的に ON に設定する必要があります。

SET オプションの設定を誤ると、次の 1 つ以上の現象が発生する場合があります。

  • データベース エンジンによりエラーが生成され、インデックスに格納されたデータ値を変更していた INSERT ステートメント、UPDATE ステートメント、または DELETE ステートメントがロールバックされます。

  • Transact-SQL ステートメントの実行プランで、クエリ オプティマイザーがインデックスを無視します。

  • インデックス付きビューまたはインデックス付き計算列を作成できません。

OLE DB 接続および ODBC 接続の SET オプション設定

ほとんどのアプリケーションでは、SQL Server Management Studio、Integration Services、レプリケーション、一括コピー操作などを含めた SQL Server インスタンスへの接続に、OLE DB Provider for SQL Server または SQL Server ODBC ドライバーのいずれかが使用されます。OLE DB および ODBC の既定の設定では、ビューまたは計算列のインデックスに必要な 6 つの SET オプションが正しく設定されています。OLE DB および ODBC の既定値については、上記の表を参照してください。これらの設定は、ISO 標準のルール設定であり、SQL Server の推奨設定です。詳細については、「クライアント ネットワーク構成」を参照してください。

注意

一部の SQL Server ユーティリティでは、以前のバージョンのユーティリティとの互換性を維持するために、1 つ以上の ANSI 設定が OFF に設定されています。

DB-Library 接続および Embedded SQL for C 接続の SET オプション設定

DB-Library アプリケーションや Embedded SQL for C アプリケーションは、既定ではセッション オプションが設定されません。これらの API を使用するシステムでは、適切な SET ステートメントが発行されるようにアプリケーションをコーディングするか、データベースまたはサーバーの既定値を正しい設定に変更する必要があります。

オプション設定の優先順位

SET オプションの ON または OFF の設定は、複数のレベルで指定できます。各セッション オプションの最終的な設定は、そのオプションを設定する優先順位が最も高い操作によって決定されます。セッション設定操作の優先順位は、優先順位の高い順に次のとおりです。

  • 任意のアプリケーションからサーバーに接続した後で、SET ステートメントを実行して既定の設定を明示的に無効にできます。SET ステートメントを実行すると前の設定がすべて無効になります。また、SET ステートメントによって、アプリケーションの実行時に、オプションを動的に ON または OFF に設定することができます。オプション設定は現在の接続セッションにのみ適用されます。

  • OLE DB アプリケーションおよび ODBC アプリケーションを使用するとき、接続文字列でオプション設定を指定することで、接続時に有効となるオプション設定を指定できます。オプション設定は現在の接続セッションにのみ適用されます。

  • コントロール パネルの ODBC アプリケーションまたは ODBC の SQLConfigDataSource 関数を使用して、SQL Server ODBC データ ソースに指定した SET オプション。

  • データベースの既定の設定。既定値を指定するには、ALTER DATABASE または SQL Server Management Studio のオブジェクト エクスプローラーを使用します。

  • サーバーの既定の設定。既定値を指定するには、sp_configure または SQL Server Management Studio のオブジェクト エクスプローラーを使用して、user options というサーバー構成オプションを設定します。

たとえば、ODBC での ANSI_NULLS の既定値は ON ですが、このオプションを ODBC 接続文字列で OFF に設定するか、データベースに接続した後に SET ステートメントを使用して、この既定値を無効にできます。

ストアド プロシージャとトリガー

ストアド プロシージャおよびトリガーは、ビューまたは計算列のインデックスをサポートするために必要な 6 つの SET オプションが機能するように記述する必要があります。SET オプションの設定が誤っている場合、ストアド プロシージャまたはトリガーから実行する SELECT ステートメントではビューまたは計算列のインデックスが使用されません。INSERT、UPDATE、または DELETE のいずれかのステートメントをストアド プロシージャまたはトリガーで使用して、インデックス付きビューまたはインデックス付き計算列に格納されているデータ値を変更すると、エラーが発生します。

考慮事項

SET ステートメントによってセッション オプションは動的に変更されるので、インデックス付きビューやインデックス付き計算列があるデータベースで SET ステートメントを実行する場合は、注意が必要です。たとえば、既定の設定でインデックス付きビューまたはインデックス付き計算列の参照を許可する接続をアプリケーションから確立するとします。しかし、その接続で呼び出すストアド プロシージャまたはトリガーに SET ANSI_WARNINGS OFF というステートメントがある場合、最初にそのステートメントが現れた時点で ANSI_WARNINGS に関するそれまでの既定値や設定は無効になります。その場合、ストアド プロシージャまたはトリガーのステートメントをクエリ オプティマイザーで処理するときに、すべてのインデックス付きビューまたはインデックス付き計算列は無視されます。

そのほかに、DATEFIRST、DATEFORMAT、および LANGUAGE という 3 つのセッション オプションが、結果セットの形式に影響を与える可能性があります。オプションの変更によって結果が影響を受ける関数は非決定的関数と分類されるので、インデックス付きビューまたはインデックス付き計算列では使用できません。