В SQL Server можете да използвате SESSION_CONTEXT()
функция за четене на стойността на определен ключ в контекста на текущата сесия.
Ключът (двойка ключ/стойност) трябва да се зададе първо. Това може да стане с sp_set_session_context
съхранена процедура.
След като двойка ключ/стойност е зададена за сесията, можете да използвате SESSION_CONTEXT()
за да върнете стойността на този ключ.
Пример 1 – Задаване и връщане на стойността
Ето пример, който демонстрира основната концепция и употреба.
EXEC sp_set_session_context @key =N'user_id', @value =15;SELECT SESSION_CONTEXT(N'user_id') КАТО user_id;
Резултат:
+-----------+| user_id ||-----------|| 15 |+-----------+
Пример 2 – Когато ключ не съществува
Ето какво се случва, ако се опитате да получите стойността от ключ, който не съществува.
ИЗБЕРЕТЕ SESSION_CONTEXT(N'oops') КАТО опа;
Резултат:
+--------+| опа ||--------|| NULL |+--------+
Пример 3 – Префиксът „N“
Аргументът, предоставен на SESSION_CONTEXT()
е от тип sysname . По принцип това е същото като nvarchar(128) NOT NULL
, което означава, че трябва да поставите префикс на аргумента с N
знак.
Ето какво се случва, ако премахна N
префикс:
EXEC sp_set_session_context @key ='език', @value ='Английски';SELECT SESSION_CONTEXT('language') КАТО език;
Резултат:
Съобщение 8116, ниво 16, състояние 1, ред 5 Аргументен тип данни varchar е невалиден за аргумент 1 на функцията session_context.
Като премахнете N
префикс, просто предавам varchar , когато трябва да е nvarchar (или име на системата за да бъдем точни).
Ето го с N
префикс:
EXEC sp_set_session_context @key =N'език', @value ='Английски';ИЗБЕРЕТЕ SESSION_CONTEXT(N'език') КАТО език;
Резултат:
+-----------+| език ||------------|| Английски |+------------+
Пример 4 – Връщаната стойност
Типът връщане на SESSION_CONTEXT()
е sql_variant .
Можете да използвате SQL_VARIANT_PROPERTY()
функция, за да разберете основния тип.
Пример:
ИЗБЕРЕТЕ SQL_VARIANT_PROPERTY( SESSION_CONTEXT(N'user_id'), 'BaseType' ) КАТО user_id, SQL_VARIANT_PROPERTY( SESSION_CONTEXT(N'language'), 'BaseType' ) КАТО език;
Резултат:
+-----------+------------+| потребителски_идентификатор | език ||-----------+------------|| int | varchar |+-----------+------------+
Пример 5 – Конкатенация на върнати стойности
Ако трябва да обедините няколко резултата, ще трябва да конвертирате резултатите в тип данни, различен от sql_variant първо.
Ето пример за това какво се случва, ако не направя това:
Пример:
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')pre.>Резултат:
Съобщение 257, ниво 16, състояние 3, ред 1 Неявно преобразуване от тип данни sql_variant към varchar не е разрешено. Използвайте функцията CONVERT, за да изпълните тази заявка.Така че трябва изрично да конвертирам резултатите с помощта на
CAST()
илиCONVERT()
преди да ги свържете.Пример:
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)_CONTEXT(SESSION' user_lname') AS varchar(7)) ) AS Резултат;Резултат:
+--------------+| Резултат ||--------------|| Хоумър Симпсън |+--------------+