Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Correzione del messaggio 8116 "Il tipo di dati dell'argomento varchar non è valido per l'argomento 1 della funzione session_context" in SQL Server

Se ricevi un messaggio di errore SQL Server 8116 con il messaggio Il tipo di dati dell'argomento varchar non è valido per l'argomento 1 della funzione session_context , è perché stai passando il tipo di dati sbagliato a una funzione, in questo caso il SESSION_CONTEXT() funzione.

Questo può accadere se passi una stringa letterale a SESSION_CONTEXT() funzione senza anteporre il N carattere.

Lo stesso errore (Msg 8116) può verificarsi anche in altri contesti:non è limitato a SESSION_CONTEXT() funzione. Ad esempio, potresti ricevere lo stesso errore quando usi SUBSTRING() funzione.

Esempio di errore

Ecco un esempio di codice che produce l'errore:

EXEC sp_set_session_context 
    @key = 'language', 
    @value = 'English'; 
SELECT SESSION_CONTEXT('language');

Risultato:

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

Qui, ho passato una stringa come primo argomento a SESSION_CONTEXT() , ma non l'ho preceduto con N .

L'argomento fornito a SESSION_CONTEXT() è la chiave del valore da recuperare. Deve essere di tipo sysname . Questo è fondamentalmente lo stesso di nvarchar(128) NOT NULL , il che significa che devi anteporre alla stringa letterale il N carattere.

Lo stesso errore (Msg 8116) può verificarsi in molti altri contesti:non è limitato a SESSION_CONTEXT() funzione.

In ogni caso, significa che stai passando il tipo di dati sbagliato alla funzione.

Soluzione

Per risolvere il problema di cui sopra, tutto ciò che dobbiamo fare è anteporre alla chiave il N carattere:

EXEC sp_set_session_context 
    @key = 'language', 
    @value = 'English'; 
SELECT SESSION_CONTEXT(N'language');

Risultato:

English

Problema risolto. Tutto quello che ho fatto con cambiare 'language' a N'language' .

Come accennato, l'errore 8116 non è limitato a SESSION_CONTEXT() funzione. In ogni caso, la soluzione è la stessa:assicurati che l'argomento sia di un tipo di dati accettato dalla funzione.