Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Correção da mensagem 8116 “O tipo de dados do argumento varchar é inválido para o argumento 1 da função session_context” no SQL Server


Se você estiver recebendo a mensagem de erro 8116 do SQL Server com a mensagem Argument data type varchar is invalid for argument 1 of session_context function , é porque você está passando o tipo de dados errado para uma função - neste caso, o SESSION_CONTEXT() função.

Isso pode acontecer se você passar uma string literal para o SESSION_CONTEXT() função sem prefixá-la com o N personagem.

O mesmo erro (Msg 8116) também pode ocorrer em outros contextos – não se limita ao SESSION_CONTEXT() função. Por exemplo, você pode obter o mesmo erro ao usar o SUBSTRING() função.

Exemplo do erro


Aqui está um exemplo de código que produz o erro:
EXEC sp_set_session_context 
    @key = 'language', 
    @value = 'English'; 
SELECT SESSION_CONTEXT('language');

Resultado:
Msg 8116, Level 16, State 1, Line 4
Argument data type varchar is invalid for argument 1 of session_context function.

Aqui, passei uma string como o primeiro argumento para SESSION_CONTEXT() , mas não prefixei com N .

O argumento fornecido para SESSION_CONTEXT() é a chave do valor que está sendo recuperado. Deve ser do tipo sysname . Isso é basicamente o mesmo que nvarchar(128) NOT NULL , o que significa que você precisa prefixar a string literal com o N personagem.

O mesmo erro (Msg 8116) pode ocorrer em muitos outros contextos – não se limita ao SESSION_CONTEXT() função.

De qualquer forma, isso significa que você está passando o tipo de dados errado para a função.

Solução


Para resolver o problema acima, tudo o que precisamos fazer é prefixar a chave com o N personagem:
EXEC sp_set_session_context 
    @key = 'language', 
    @value = 'English'; 
SELECT SESSION_CONTEXT(N'language');

Resultado:
English

Problema resolvido. Tudo o que fiz foi alterar 'language' para N'language' .

Conforme mencionado, o erro 8116 não se limita ao SESSION_CONTEXT() função. De qualquer forma, a solução é a mesma – certifique-se de que o argumento seja de um tipo de dados que a função aceita.