SET (Transact-SQL)
Transact-SQL プログラミング言語には、現在のセッションにおける特定の情報の処理方法を変更する SET ステートメントがいくつか用意されています。これらの SET ステートメントは、次の表に示すカテゴリに分類されます。
SET ステートメントを使用したローカル変数の設定の詳細については、「SET @local_variable (Transact-SQL)」を参照してください。
カテゴリ |
ステートメント |
---|---|
日付時刻ステートメント |
|
ロック ステートメント |
|
その他のステートメント |
|
クエリ実行ステートメント |
|
ISO 設定ステートメント |
|
統計ステートメント |
|
トランザクション ステートメント |
SET ステートメントの使用に関する注意点
SET FIPS_FLAGGER、SET OFFSETS、SET PARSEONLY、SET QUOTED_IDENTIFIER を除くすべての SET ステートメントは、実行時に実装されます。SET FIPS_FLAGGER、SET OFFSETS、SET PARSEONLY、SET QUOTED_IDENTIFIER ステートメントは解析時に実装されます。
SET ステートメントをストアド プロシージャまたはトリガ内で実行した場合、SET オプションの値は、ストアド プロシージャやトリガから制御が返された後、元に戻されます。また、動的 SQL 文字列内で SET ステートメントを指定し、これを sp_executesql または EXECUTE のいずれかで実行した場合、SET オプションの値は、動的 SQL 文字列で指定したバッチから制御が返された後、元に戻されます。
ストアド プロシージャでは、SET ANSI_NULLS と SET QUOTED_IDENTIFIERS を除き、実行時に指定した SET 設定が使用されます。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_NULLS のデータベース設定よりも優先されます。さらに、前回 sp_configure user options 設定を使用したときに有効になった値や、すべての ODBC および OLE/DB 接続に適用される値を使用してデータベースに接続すると、自動的に ON になる接続設定がいくつかあります。
ALTER、CREATE、および DROP DATABASE ステートメントでは、SET LOCK_TIMEOUT の設定は無視されます。
SET ANSI_DEFAULTS などのグローバルまたはショートカット SET ステートメントでいくつかの設定を行っている場合、ショートカット SET ステートメントを実行すると、そのショートカット SET ステートメントの影響を受けるすべてのオプションに関する既存の設定がリセットされます。ショートカット SET ステートメントを実行した後、ショートカット SET ステートメントの影響を受ける SET オプションを個別に明示的に設定した場合は、個別の SET ステートメントの値の方が、対応するショートカットの設定よりも優先されます。
バッチを使用する場合、データベースのコンテキストは、USE ステートメントを使って確立したバッチによって決まります。ストアド プロシージャの外部で実行される、バッチ内のアドホック クエリとその他すべてのステートメントは、USE ステートメントによって確立されるデータベースと接続のオプション設定を継承します。
複数のアクティブな結果セット (MARS) 要求では、グローバル状態が共有されます。この状態には、最新のセッションでの SET オプション設定が含まれます。各要求を実行するとき、SET オプションを変更できます。この変更は対象となる要求のコンテキストだけに適用され、同時実行される他の MARS 要求には影響しませんが、要求の実行が完了した後に、新しい SET オプションがグローバル セッション状態にコピーされます。この変更後、同じセッションで実行される新しい要求では、これらの新しい SET オプション設定が使用されます。
バッチまたは他のストアド プロシージャから実行されるストアド プロシージャでは、そのストアド プロシージャが格納されているデータベースに現在設定されているオプション値が使用されます。たとえば、ストアド プロシージャ db1.dbo.sp1 でストアド プロシージャ db2.dbo.sp2 を呼び出す場合、ストアド プロシージャ sp1 はデータベース db1 の現在の互換性レベル設定で実行され、ストアド プロシージャ sp2 はデータベース db2 の現在の互換性レベル設定で実行されます。
Transact-SQL ステートメントで複数のデータベースにあるオブジェクトを参照するときには、現在のデータベース コンテキストと現在の接続コンテキストがステートメントに適用されます。ここで、Transact-SQL ステートメントがバッチ内にある場合、現在の接続コンテキストは USE ステートメントで定義したデータベースになります。Transact-SQL ステートメントがストアド プロシージャ内にある場合、接続コンテキストはそのストアド プロシージャが格納されているデータベースになります。
計算列またはインデックス付きビューでインデックスを作成または操作する場合は、SET オプションの ARITHABORT、CONCAT_NULL_YIELDS_NULL、QUOTED_IDENTIFIER、ANSI_NULLS、ANSI_PADDING、および ANSI_WARNINGS を ON に設定する必要があります。NUMERIC_ROUNDABORT オプションは OFF に設定する必要があります。
これらのオプションのうち 1 つでも正しく設定しなかった場合は、インデックス付きビューに対して、または計算列にインデックスが含まれているテーブルに対して INSERT、UPDATE、DELETE、DBCC CHECKDB、および DBCC CHECKTABLE を実行すると操作は失敗します。SQL Server ではエラーが発生し、正しく設定されなかったすべてのオプションが一覧表示されます。また、SQL Server では、このようなテーブルやインデックス付きビューに対して SELECT ステートメントを実行すると、計算列またはビューにインデックスが存在しないものとして処理されます。