In SQL Server kunt u de SESSION_CONTEXT() functie om de waarde van een gespecificeerde sleutel in de huidige sessiecontext te lezen.
De sleutel (sleutel/waarde-paar) moet eerst worden ingesteld. Dit kan gedaan worden met de sp_set_session_context opgeslagen procedure.
Zodra een sleutel/waarde-paar is ingesteld voor de sessie, kunt u SESSION_CONTEXT() gebruiken om de waarde van die sleutel te retourneren.
Voorbeeld 1 - De waarde instellen en retourneren
Hier is een voorbeeld dat het basisconcept en gebruik demonstreert.
EXEC sp_set_session_context @key = N'user_id', @value = 15; SELECT SESSION_CONTEXT(N'user_id') AS user_id;
Resultaat:
+-----------+ | user_id | |-----------| | 15 | +-----------+
Voorbeeld 2 – Wanneer een sleutel niet bestaat
Dit is wat er gebeurt als je de waarde probeert te krijgen van een sleutel die niet bestaat.
SELECT SESSION_CONTEXT(N'oops') AS oops;
Resultaat:
+--------+ | oops | |--------| | NULL | +--------+
Voorbeeld 3 – Het voorvoegsel “N”
Het argument geleverd aan SESSION_CONTEXT() is van het type sysname . In principe is dit hetzelfde als nvarchar(128) NOT NULL , wat betekent dat je het argument moet voorvoegen met de N karakter.
Dit gebeurt er als ik de N . verwijder voorvoegsel:
EXEC sp_set_session_context
@key = 'language',
@value = 'English';
SELECT SESSION_CONTEXT('language') AS language;
Resultaat:
Msg 8116, Level 16, State 1, Line 5 Argument data type varchar is invalid for argument 1 of session_context function.
Door de N . te verwijderen prefix, ik geef gewoon een varchar door , terwijl het nvarchar . zou moeten zijn (of sysname Om precies te zijn).
Hier is het met de N voorvoegsel:
EXEC sp_set_session_context @key = N'language', @value = 'English'; SELECT SESSION_CONTEXT(N'language') AS language;
Resultaat:
+------------+ | language | |------------| | English | +------------+
Voorbeeld 4 – De retourwaarde
Het retourtype van SESSION_CONTEXT() is sql_variant .
U kunt de SQL_VARIANT_PROPERTY() . gebruiken functie om het basistype te achterhalen.
Voorbeeld:
SELECT
SQL_VARIANT_PROPERTY(
SESSION_CONTEXT(N'user_id'), 'BaseType'
) AS user_id,
SQL_VARIANT_PROPERTY(
SESSION_CONTEXT(N'language'), 'BaseType'
) AS language;
Resultaat:
+-----------+------------+ | user_id | language | |-----------+------------| | int | varchar | +-----------+------------+
Voorbeeld 5 – Retourwaarden aaneenschakelen
Als u meerdere resultaten moet samenvoegen, moet u de resultaten converteren naar een ander gegevenstype dan sql_variant eerst.
Hier is een voorbeeld van wat er gebeurt als ik dit niet doe:
Voorbeeld:
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;
> Resultaat:
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.
Dus ik moet de resultaten expliciet converteren met behulp van CAST() of CONVERT() voordat u ze samenvoegt.
Voorbeeld:
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;
Resultaat:
+--------------+ | Result | |--------------| | HomerSimpson | +--------------+