使用会话上下文信息

会话上下文信息使应用程序最多能够设置 128 字节的二进制值,这些二进制值可由在同一会话上运行的多个批处理、存储过程、触发器或用户定义函数引用。可以使用 SET CONTEXT_INFO 语句设置会话上下文值,并使用下列方法之一检索该值:

  • CONTEXT_INFO 函数。

  • sys.dm_exec_requests 中的 context_info 列、sys.dm_exec_sessions 动态管理视图以及 sys.sysprocesses 兼容视图。

会话上下文信息不同于 Transact-SQL 变量,后者的作用域局限于当前 Transact-SQL 批处理、存储过程、触发器或用户定义函数。会话上下文信息可用于存储每个用户或应用程序当前状态所特有的信息。这些信息随后可用于控制 Transact-SQL 语句中的逻辑。

CONTEXT_INFO 函数是检索当前会话的会话上下文的首选方法。也可以从 sys.dm_exec_requests 中的 context_info 列或 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 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;
    

新值不会传播到 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 视图的行。