Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Поправете съобщение 8116 „Типът на данни за аргумента varchar е невалиден за аргумент 1 на функцията session_context“ в SQL Server

Ако получавате съобщение за грешка на 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() функция. Така или иначе решението е същото – уверете се, че аргументът е от тип данни, който функцията приема.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Получавате часа на дата и час с помощта на T-SQL?

  2. Свържете PHP към MSSQL чрез PDO ODBC

  3. Не може да бъде намерен сборка „Microsoft.SqlServer.Types“ версия 10 или по-нова

  4. Как да инсталирате SQL Server на SUSE 12

  5. Как да сравните datetime само с дата в SQL Server