Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Fonctionnement de SESSION_CONTEXT() dans SQL Server

Dans SQL Server, vous pouvez utiliser le SESSION_CONTEXT() fonction pour lire la valeur d'une clé spécifiée dans le contexte de session en cours.

La clé (paire clé/valeur) doit d'abord être définie. Cela peut être fait avec le sp_set_session_context procédure stockée.

Une fois qu'une paire clé/valeur a été définie pour la session, vous pouvez utiliser SESSION_CONTEXT() pour renvoyer la valeur de cette clé.

Exemple 1 - Définir et renvoyer la valeur

Voici un exemple qui illustre le concept et l'utilisation de base.

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

SELECT SESSION_CONTEXT(N'user_id') AS user_id;

Résultat :

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

Exemple 2 - Lorsqu'une clé n'existe pas

Voici ce qui se passe si vous essayez d'obtenir la valeur d'une clé qui n'existe pas.

SELECT SESSION_CONTEXT(N'oops') AS oops;

Résultat :

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

Exemple 3 - Le préfixe "N"

L'argument fourni à SESSION_CONTEXT() est de type sysname . Fondamentalement, c'est la même chose que nvarchar(128) NOT NULL , ce qui signifie que vous devez préfixer l'argument avec le N caractère.

Voici ce qui se passe si je supprime le N préfixe :

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

SELECT SESSION_CONTEXT('language') AS language;

Résultat :

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

En supprimant le N préfixe, je passe simplement un varchar , alors qu'il devrait être nvarchar (ou sysname pour être exact).

Le voici avec le N préfixe :

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

SELECT SESSION_CONTEXT(N'language') AS language;

Résultat :

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

Exemple 4 - La valeur de retour

Le type de retour de SESSION_CONTEXT() est sql_variant .

Vous pouvez utiliser le SQL_VARIANT_PROPERTY() fonction pour connaître le type de base.

Exemple :

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

Résultat :

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

Exemple 5 - Concaténation des valeurs de retour

Si vous avez besoin de concaténer plusieurs résultats, vous devrez convertir les résultats en un type de données autre que sql_variant première.

Voici un exemple de ce qui se passe si je ne le fais pas :

Exemple :

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;

Résultat :

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.

J'ai donc besoin de convertir explicitement les résultats en utilisant soit CAST() ou CONVERT() avant de les concaténer.

Exemple :

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;

Résultat :

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