Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come funziona SESSION_CONTEXT() in SQL Server

In SQL Server puoi utilizzare SESSION_CONTEXT() funzione per leggere il valore di una chiave specificata nel contesto della sessione corrente.

La chiave (coppia chiave/valore) deve essere prima impostata. Questo può essere fatto con sp_set_session_context procedura memorizzata.

Una volta impostata una coppia chiave/valore per la sessione, puoi utilizzare SESSION_CONTEXT() per restituire il valore di quella chiave.

Esempio 1:impostare e restituire il valore

Ecco un esempio che illustra il concetto e l'utilizzo di base.

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

SELECT SESSION_CONTEXT(N'user_id') AS user_id;

Risultato:

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

Esempio 2 – Quando una chiave non esiste

Ecco cosa succede se provi a ottenere il valore da una chiave che non esiste.

SELECT SESSION_CONTEXT(N'oops') AS oops;

Risultato:

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

Esempio 3 – Il prefisso “N”

L'argomento fornito a SESSION_CONTEXT() è di tipo sysname . Fondamentalmente, questo è lo stesso di nvarchar(128) NOT NULL , il che significa che devi anteporre all'argomento il N carattere.

Ecco cosa succede se rimuovo il N prefisso:

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

SELECT SESSION_CONTEXT('language') AS language;

Risultato:

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

Rimuovendo il N prefisso, sto semplicemente passando un varchar , quando dovrebbe essere nvarchar (o nomesistema per essere precisi).

Eccolo con il N prefisso:

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

SELECT SESSION_CONTEXT(N'language') AS language;

Risultato:

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

Esempio 4 – Il valore di ritorno

Il tipo restituito di SESSION_CONTEXT() è sql_variant .

Puoi usare SQL_VARIANT_PROPERTY() funzione per scoprire il tipo di base.

Esempio:

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

Risultato:

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

Esempio 5 – Concatenazione di valori restituiti

Se devi concatenare più risultati, dovrai convertire i risultati in un tipo di dati diverso da sql_variant primo.

Ecco un esempio di cosa succede se non lo faccio:

Esempio:

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;

Risultato:

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.

Quindi ho bisogno di convertire esplicitamente i risultati usando CAST() o CONVERT() prima di concatenarli.

Esempio:

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;

Risultato:

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