Использование сведений о контексте сеансов
Сведения о контексте сеанса позволяют приложениям устанавливать двоичные значения размером до 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)