Использование сведений о контексте сеансов

Сведения о контексте сеанса позволяют приложениям устанавливать двоичные значения размером до 128 байт, на которые можно ссылаться из нескольких пакетов, хранимых процедур, триггеров, пользовательских функций, работающих в том же сеансе. Можно установить контекст сеанса, используя инструкцию SET CONTEXT_INFO, и извлечь его, используя:

  • функцию CONTEXT_INFO;
  • столбцы context_info в динамических административных представлениях sys.dm_exec_requests и sys.dm_exec_sessions и представлении совместимости sys.sysprocesses.

Сведения о контексте сеанса отличаются от переменных языка Transact-SQL, чья область ограничена текущим пакетом, хранимой процедурой, триггером или пользовательской функцией языка Transact-SQL. Сведения о контексте сеанса могут быть использованы для хранения сведений, специфических для каждого пользователя или текущего состояния приложения. Это может быть позже использовано для управления логикой инструкций языка Transact-SQL.

Использование функции CONTEXT_INFO является более предпочтительным при получении контекста текущего сеанса. Также можно извлечь значения контекста сеанса для текущих сеансов и пакетов из столбцов context_info динамического административного представления sys.dm_exec_requests или sys.dm_exec_sessions. Чтобы осуществить выборку из этих представлений, необходимо наличие разрешений 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 AdventureWorks;
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;
    
  • из столбца context_info в строке sys.dm_exec_requests, связанной с текущим пакетом:

    SELECT context_info AS MyCtxInfo
    FROM sys.dm_exec_requests
    WHERE session_id = @@SPID
       AND request_id = CURRENT_REQUEST_ID();
    
  • из столбца context_info в строке sys.sysprocesses, связанной с текущим сеансом:

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

Новое значение не распространяется на представление sys.dm_exec_sessions до тех пор, пока выполнение пакета, содержащего инструкцию SET CONTEXT_INFO, не будет завершено. По завершении выполнения пакета новое значение помещается в строку, связанную с текущим сеансом.

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, которая ассоциирована с пакетом, устанавливающим значение.

См. также

Основные понятия

Среда выполнения пакетов и режим MARS

Другие ресурсы

CONTEXT_INFO (Transact-SQL)
SET CONTEXT_INFO (Transact-SQL)
sys.dm_exec_requests
sys.dm_exec_sessions
sys.sysprocesses (Transact-SQL)

Справка и поддержка

Получение помощи по SQL Server 2005