sql >> Base de Datos >  >> RDS >> Sqlserver

Corrija el mensaje 8116 "El tipo de datos del argumento varchar no es válido para el argumento 1 de la función session_context" en SQL Server

Si recibe el mensaje de error 8116 de SQL Server con el mensaje El tipo de datos del argumento varchar no es válido para el argumento 1 de la función session_context , es porque está pasando el tipo de datos incorrecto a una función; en este caso, SESSION_CONTEXT() función.

Esto puede suceder si pasa un literal de cadena a SESSION_CONTEXT() función sin prefijarla con el N personaje.

El mismo error (Msg 8116) también puede ocurrir en otros contextos; no se limita a SESSION_CONTEXT() función. Por ejemplo, podría obtener el mismo error al usar SUBSTRING() función.

Ejemplo del error

Aquí hay un ejemplo de código que produce el error:

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.

Aquí, pasé una cadena como primer argumento a SESSION_CONTEXT() , pero no le puse el prefijo N .

El argumento proporcionado a SESSION_CONTEXT() es la clave del valor que se está recuperando. Debe ser del tipo sysname . Esto es básicamente lo mismo que nvarchar(128) NOT NULL , lo que significa que debe anteponer el literal de cadena con el N personaje.

El mismo error (Msg 8116) puede ocurrir en muchos otros contextos; no se limita a SESSION_CONTEXT() función.

De cualquier manera, significa que está pasando el tipo de datos incorrecto a la función.

Solución

Para resolver el problema anterior, todo lo que tenemos que hacer es prefijar la clave con el N carácter:

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

Resultado:

English

Problema resuelto. Todo lo que hice con cambiar 'language' a N'language' .

Como se mencionó, el error 8116 no se limita a SESSION_CONTEXT() función. De cualquier manera, la solución es la misma:asegúrese de que el argumento sea de un tipo de datos que acepte la función.