I SQL Server kan du använda SESSION_CONTEXT()
funktion för att läsa värdet på en angiven nyckel i den aktuella sessionskontexten.
Nyckeln (nyckel/värdepar) måste ställas in först. Detta kan göras med sp_set_session_context
lagrad procedur.
När ett nyckel-/värdepar har ställts in för sessionen kan du använda SESSION_CONTEXT()
för att returnera nyckelns värde.
Exempel 1 – Ange och returnera värdet
Här är ett exempel som visar det grundläggande konceptet och användningen.
EXEC sp_set_session_context @key = N'user_id', @value = 15; SELECT SESSION_CONTEXT(N'user_id') AS user_id;
Resultat:
+-----------+ | user_id | |-----------| | 15 | +-----------+
Exempel 2 – När en nyckel inte finns
Det här är vad som händer om du försöker få värdet från en nyckel som inte finns.
SELECT SESSION_CONTEXT(N'oops') AS oops;
Resultat:
+--------+ | oops | |--------| | NULL | +--------+
Exempel 3 – Prefixet "N"
Argumentet till SESSION_CONTEXT()
är av typen sysname . I grund och botten är detta detsamma som nvarchar(128) NOT NULL
, vilket betyder att du måste prefixa argumentet med N
tecken.
Här är vad som händer om jag tar bort N
prefix:
EXEC sp_set_session_context @key = 'language', @value = 'English'; SELECT SESSION_CONTEXT('language') AS language;
Resultat:
Msg 8116, Level 16, State 1, Line 5 Argument data type varchar is invalid for argument 1 of session_context function.
Genom att ta bort N
prefix, jag passerar helt enkelt i en varchar , när det ska vara nvarchar (eller sysname för att vara exakt).
Här är den med N
prefix:
EXEC sp_set_session_context @key = N'language', @value = 'English'; SELECT SESSION_CONTEXT(N'language') AS language;
Resultat:
+------------+ | language | |------------| | English | +------------+
Exempel 4 – Returvärdet
Returtypen för SESSION_CONTEXT()
är sql_variant .
Du kan använda SQL_VARIANT_PROPERTY()
funktion för att ta reda på bastypen.
Exempel:
SELECT SQL_VARIANT_PROPERTY( SESSION_CONTEXT(N'user_id'), 'BaseType' ) AS user_id, SQL_VARIANT_PROPERTY( SESSION_CONTEXT(N'language'), 'BaseType' ) AS language;
Resultat:
+-----------+------------+ | user_id | language | |-----------+------------| | int | varchar | +-----------+------------+
Exempel 5 – Sammanfoga returvärden
Om du behöver sammanfoga flera resultat måste du konvertera resultaten till en annan datatyp än sql_variant först.
Här är ett exempel på vad som händer om jag inte gör det här:
Exempel:
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;>
Resultat:
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.
Så jag måste explicit konvertera resultaten med antingen CAST()
eller CONVERT()
innan du sammanfogar dem.
Exempel:
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;
Resultat:
+--------------+ | Result | |--------------| | HomerSimpson | +--------------+