Ако получавате съобщение за грешка на SQL Server 8116 със съобщението Типът на данните за аргумента varchar е невалиден за аргумент 1 на функцията session_context , това е защото предавате грешен тип данни на функция – в този случай SESSION_CONTEXT()
функция.
Това може да се случи, ако подадете низов литерал към SESSION_CONTEXT()
функция, без да й поставяте префикс с N
знак.
Същата грешка (Msg 8116) може да възникне и в други контексти – тя не е ограничена до SESSION_CONTEXT()
функция. Например, можете да получите същата грешка, когато използвате SUBSTRING()
функция.
Пример за грешката
Ето пример за код, който създава грешката:
EXEC sp_set_session_context
@key = 'language',
@value = 'English';
SELECT SESSION_CONTEXT('language');
Резултат:
Msg 8116, Level 16, State 1, Line 4 Argument data type varchar is invalid for argument 1 of session_context function.
Тук предадох низ като първи аргумент на SESSION_CONTEXT()
, но не го поставих с префикс с N
.
Аргументът, предоставен на SESSION_CONTEXT()
е ключът на стойността, която се извлича. Трябва да е от тип sysname
. Това по същество е същото като nvarchar(128) NOT NULL
, което означава, че трябва да поставите префикс на низовия литерал с N
знак.
Същата грешка (Msg 8116) може да възникне в много други контексти – тя не е ограничена до SESSION_CONTEXT()
функция.
Така или иначе, това означава, че предавате грешен тип данни на функцията.
Решение
За да разрешим горния проблем, всичко, което трябва да направим, е да поставим префикс на ключа с N
знак:
EXEC sp_set_session_context
@key = 'language',
@value = 'English';
SELECT SESSION_CONTEXT(N'language');
Резултат:
English
Проблема решен. Всичко, което направих с промяна на 'language'
на N'language'
.
Както бе споменато, грешка 8116 не е ограничена до SESSION_CONTEXT()
функция. Така или иначе решението е същото – уверете се, че аргументът е от тип данни, който функцията приема.