sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo funciona SESSION_CONTEXT() en SQL Server

En SQL Server, puede usar SESSION_CONTEXT() función para leer el valor de una clave específica en el contexto de la sesión actual.

La clave (par clave/valor) debe configurarse primero. Esto se puede hacer con el sp_set_session_context procedimiento almacenado.

Una vez que se ha establecido un par clave/valor para la sesión, puede usar SESSION_CONTEXT() para devolver el valor de esa clave.

Ejemplo 1:establecer y devolver el valor

Aquí hay un ejemplo que demuestra el concepto básico y el uso.

EXEC sp_set_session_context
  @key = N'user_id',
  @value = 15;

SELECT SESSION_CONTEXT(N'user_id') AS user_id;

Resultado:

+-----------+
| user_id   |
|-----------|
| 15        |
+-----------+

Ejemplo 2:cuando una clave no existe

Esto es lo que sucede si intenta obtener el valor de una clave que no existe.

SELECT SESSION_CONTEXT(N'oops') AS oops;

Resultado:

+--------+
| oops   |
|--------|
| NULL   |
+--------+

Ejemplo 3:el prefijo "N"

El argumento proporcionado a SESSION_CONTEXT() es de tipo sysname . Básicamente, esto es lo mismo que nvarchar(128) NOT NULL , lo que significa que debe prefijar el argumento con N personaje.

Esto es lo que sucede si elimino la N prefijo:

EXEC sp_set_session_context
  @key = 'language',
  @value = 'English';

SELECT SESSION_CONTEXT('language') AS language;

Resultado:

Msg 8116, Level 16, State 1, Line 5
Argument data type varchar is invalid for argument 1 of session_context function.

Eliminando el N prefijo, simplemente paso un varchar , cuando debería ser nvarchar (o nombre del sistema para ser exacto).

Aquí está con el N prefijo:

EXEC sp_set_session_context
  @key = N'language',
  @value = 'English';

SELECT SESSION_CONTEXT(N'language') AS language;

Resultado:

+------------+
| language   |
|------------|
| English    |
+------------+

Ejemplo 4:el valor de retorno

El tipo de retorno de SESSION_CONTEXT() es sql_variant .

Puede usar SQL_VARIANT_PROPERTY() función para averiguar el tipo base.

Ejemplo:

SELECT 
  SQL_VARIANT_PROPERTY(
      SESSION_CONTEXT(N'user_id'), 'BaseType'
      ) AS user_id,
  SQL_VARIANT_PROPERTY(
      SESSION_CONTEXT(N'language'), 'BaseType'
      ) AS language;

Resultado:

+-----------+------------+
| user_id   | language   |
|-----------+------------|
| int       | varchar    |
+-----------+------------+

Ejemplo 5:concatenación de valores devueltos

Si necesita concatenar varios resultados, deberá convertir los resultados a un tipo de datos que no sea sql_variant primero.

Este es un ejemplo de lo que sucede si no hago esto:

Ejemplo:

EXEC sp_set_session_context N'user_fname', 'Homer';
EXEC sp_set_session_context N'user_lname', 'Simpson';

SELECT 
  CONCAT(
      SESSION_CONTEXT(N'user_fname'), 
      SESSION_CONTEXT(N'user_lname')
      ) AS Result;

Resultado:

Msg 257, Level 16, State 3, Line 1
Implicit conversion from data type sql_variant to varchar is not allowed. Use the CONVERT function to run this query.

Entonces necesito convertir explícitamente los resultados usando CAST() o CONVERT() antes de concatenarlas.

Ejemplo:

EXEC sp_set_session_context N'user_fname', 'Homer';
EXEC sp_set_session_context N'user_lname', 'Simpson';

SELECT 
  CONCAT(
      CAST(SESSION_CONTEXT(N'user_fname') AS varchar(5)),
      CAST(SESSION_CONTEXT(N'user_lname') AS varchar(7))
      ) AS Result;

Resultado:

+--------------+
| Result       |
|--------------|
| HomerSimpson |
+--------------+