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