Usar la información de contexto de la sesión

La información de contexto de la sesión permite a las aplicaciones establecer valores binarios de hasta 128 bytes a los que se puede hacer referencia en varios lotes, procedimientos almacenados, desencadenadores o funciones definidas por el usuario que trabajan en la misma sesión. Puede establecer un valor de contexto de la sesión mediante la instrucción SET CONTEXT_INFO y, a continuación, recuperarla mediante lo siguiente:

  • La función CONTEXT_INFO.

  • Las columnas context_info de las vistas de administración dinámica sys.dm_exec_requests y sys.dm_exec_sessions y la vista de compatibilidad sys.sysprocesses.

La información de contexto de la sesión difiere de las variables Transact-SQL, cuyo alcance está limitado al actual lote, procedimiento almacenado, desencadenador o función definida por el usuario de Transact-SQL. La información de contexto de la sesión se puede utilizar para almacenar información específica para cada usuario o el estado actual de la aplicación, que después puede utilizarse para controlar la lógica de las instrucciones Transact-SQL.

La función CONTEXT_INFO es la forma más habitual de recuperar el contexto de la sesión de la conexión actual. También puede recuperar los valores de contexto de todas las sesiones y los lotes actuales de las columnas context_info de las vistas de administración dinámica sys.dm_exec_requests o sys.dm_exec_sessions. La selección en estas vistas requiere los permisos SELECT y VIEW SERVER STATE. Estos permisos no son necesarios cuando se utiliza la función CONTEXT_INFO.

El uso principal de la información de contexto de la sesión es establecer un valor que se pueda mantener en varios lotes de la misma sesión. En el ejemplo siguiente se muestra el establecimiento de un valor al que se puede hacer referencia después de ejecutar varios lotes.

-- 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

Valores de información de contexto de la sesión

Si aún no se ha ejecutado SET CONTEXT_INFO para la sesión actual, se informará de los valores de sesión siguientes:

  • La función CONTEXT_INFO devolverá NULL.

  • Los valores de la columna context_info de las vistas del sistema se establecerán en 128 bytes de ceros binarios para las filas asociadas a la sesión y la solicitud actuales.

Una vez ejecutado SET CONTEXT_INFO, el nuevo valor estará disponible inmediatamente en los orígenes siguientes:

  • La función CONTEXT_INFO:

    SELECT CONTEXT_INFO() AS MyCtxInfo;
    
  • La columna context_info de la fila sys.dm_exec_requests asociada al lote actual:

    SELECT context_info AS MyCtxInfo
    FROM sys.dm_exec_requests
    WHERE session_id = @@SPID
       AND request_id = CURRENT_REQUEST_ID();
    
  • La columna context_info de la fila sys.sysprocesses asociada a la sesión actual:

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

El nuevo valor no se propagará a la vista sys.dm_exec_sessions hasta que haya finalizado la ejecución del lote que contiene la instrucción SET CONTEXT_INFO. Cuando finalice el lote, se colocará el nuevo valor en la fila asociada a la sesión actual.

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

En el ejemplo siguiente se muestra cuándo está visible un nuevo valor de información de contexto de la sesión en las vistas del sistema o la función 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;

Información de contexto de la sesión y MARS

Los conjuntos de resultados activos múltiples (MARS) permiten a las aplicaciones ejecutar varios lotes o solicitudes al mismo tiempo y en la misma conexión.

Cuando uno de los lotes de una conexión MARS ejecute SET CONTEXT_INFO, el nuevo valor de contexto estará disponible inmediatamente en los orígenes siguientes:

  • En la función CONTEXT_INFO ejecutada por el mismo lote que estableció el valor.

  • La fila de la vista sys.dm_exec_requests asociada al lote que estableció el valor.

El nuevo valor de contexto no se propagará a los orígenes siguientes hasta que haya finalizado la ejecución del lote que establece el valor:

  • La función CONTEXT_INFO ejecutada por un lote distinto del que estableció el valor. CONTEXT_INFO sólo devuelve el nuevo valor en los lotes iniciados una vez completado el lote que estableció el valor.

  • La fila de la vista sys.dm_exec_sessions asociada al lote que estableció el valor.