セッション コンテキスト情報の使用

各アプリケーションでは、セッション コンテキスト情報として最大 128 バイトのバイナリ値を設定できます。この値は、同じセッションで動作している複数のバッチ、ストアド プロシージャ、トリガー、またはユーザー定義関数から参照できます。セッション コンテキスト値を設定するには SET CONTEXT_INFO ステートメントを使用し、取得するには次のいずれかを使用します。

  • CONTEXT_INFO 関数。

  • sys.dm_exec_requests 動的管理ビュー、sys.dm_exec_sessions 動的管理ビュー、および sys.sysprocesses 互換性ビューの context_info 列。

セッション コンテキスト情報は、スコープが現在の Transact-SQL バッチ、ストアド プロシージャ、トリガー、またはユーザー定義関数に制限される Transact-SQL 変数とは異なります。セッション コンテキスト情報は、各ユーザー固有の情報またはアプリケーションの現在の状態を格納するために使用できます。その情報を使用して、Transact-SQL ステートメントのロジックを制御することも可能です。

現在のセッションのセッション コンテキストを取得するには、CONTEXT_INFO 関数を使用することをお勧めします。また、sys.dm_exec_requests 動的管理ビューまたは sys.dm_exec_sessions 動的管理ビューの context_info 列から現在のすべてのセッションとバッチのセッション コンテキスト値を取得することもできます。これらのビューから値を選択するには、SELECT 権限と VIEW SERVER STATE 権限が必要です。CONTEXT_INFO 関数を使用する場合、これらの権限は必要ありません。

セッション コンテキスト情報の主要な用途は、同じセッションであれば複数のバッチにわたって保持できる値を設定することです。次の例では、複数のバッチの実行後に参照できる値を設定しています。

-- Set context information at start.
SET CONTEXT_INFO 0x125666698456;
GO
-- Perform several nonrelated batches.
EXEC sp_helpfile;
GO
USE AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE Name LIKE (N'Metal%')
ORDER BY ProductID;
GO
-- Select the context information set several batches earlier.
SELECT CONTEXT_INFO();
GO

セッション コンテキスト情報の値

現在のセッションに対して SET CONTEXT_INFO がまだ実行されていない場合は、次のようにセッション値が報告されます。

  • CONTEXT_INFO 関数からは NULL が返されます。

  • システム ビューの context_info 列の値には、現在のセッションおよび要求に関連付けられている行に対して、バイナリのゼロが 128 バイトで設定されます。

SET CONTEXT_INFO の実行後は、次のソースで新しい値が直ちに使用可能になります。

  • CONTEXT_INFO 関数。次に例を示します。

    SELECT CONTEXT_INFO() AS MyCtxInfo;
    
  • 現在のバッチに関連付けられている sys.dm_exec_requests 行の context_info 列。次に例を示します。

    SELECT context_info AS MyCtxInfo
    FROM sys.dm_exec_requests
    WHERE session_id = @@SPID
       AND request_id = CURRENT_REQUEST_ID();
    
  • 現在のセッションに関連付けられている sys.sysprocesses 行の context_info 列。次に例を示します。

    SELECT context_info AS MyCtxInfo
    FROM sys.sysprocesses
    WHERE spid = @@SPID;
    

新しい値は、SET CONTEXT_INFO ステートメントを含むバッチの実行が終了するまで、sys.dm_exec_sessions ビューに反映されません。バッチが終了すると、現在のセッションに関連付けられている行に新しい値が格納されます。

SELECT context_info AS MyCtxInfo
FROM sys.dm_exec_sessions
WHERE session_id = @@SPID;

次の例では、セッション コンテキスト情報の新しい値がシステム ビューまたは CONTEXT_INFO 関数で表示されるタイミングを示しています。

-- Set a context value before the batch starts.
SET CONTEXT_INFO 0x9999
GO
-- Set a new context value in the batch.
SET CONTEXT_INFO 0x8888

-- Shows the new value available in the
-- sys.dm_exec_requests view while still in the batch.
SELECT context_info as RequestCtxInfoInBatch
FROM sys.dm_exec_requests
WHERE session_id = @@SPID
   AND request_id = CURRENT_REQUEST_ID();

-- Shows the new value available from the
-- CONTEXT_INFO function while still in the batch.
SELECT CONTEXT_INFO() AS FuncCtxInfoInBatch;

-- Shows that the sys.dm_exec_sessions view still
-- returns the old value in the batch.
SELECT context_info AS SessCtxInfoInBatch
FROM sys.dm_exec_sessions
WHERE session_id = @@SPID;

-- Shows the new value available in the
-- sys.sysprocesses view while still in the batch.
SELECT context_info AS ProcsCtxInfoInBatch
FROM sys.sysprocesses
WHERE spid = @@SPID;

-- End the batch.
GO

-- Shows that the sys.dm_exec_sessions view now
-- returns the new value.
SELECT context_info AS SessCtxInfoAfterBatch
FROM sys.dm_exec_sessions
WHERE session_id = @@SPID;

セッション コンテキスト情報と MARS

MARS (複数のアクティブな結果セット) により、各アプリケーションの同じ接続で複数のバッチや要求を同時に実行することが可能になります。

MARS 接続のいずれかのバッチによって SET CONTEXT_INFO が実行されると、次のソースで新しいコンテキスト値が直ちに使用可能になります。

  • 値を設定したのと同じバッチで実行される CONTEXT_INFO 関数。

  • 値を設定したバッチに関連付けられた sys.dm_exec_requests ビューの行。

次のソースでは、値を設定するバッチの実行が終了するまで、新しいコンテキスト値が反映されません。

  • 値を設定したバッチ以外のバッチによって実行される CONTEXT_INFO 関数。CONTEXT_INFO は、値を設定したバッチの完了後に開始されたバッチでのみ新しい値を返します。

  • 値を設定したバッチに関連付けられた sys.dm_exec_sessions ビューの行。