Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Correction de Msg 8116 "Le type de données d'argument varchar n'est pas valide pour l'argument 1 de la fonction session_context" dans SQL Server

Si vous obtenez l'erreur SQL Server Msg 8116 avec le message Le type de données d'argument varchar n'est pas valide pour l'argument 1 de la fonction session_context , c'est parce que vous transmettez le mauvais type de données à une fonction - dans ce cas, le SESSION_CONTEXT() fonction.

Cela peut se produire si vous transmettez un littéral de chaîne au SESSION_CONTEXT() fonction sans la préfixer du N caractère.

La même erreur (Msg 8116) peut également se produire dans d'autres contextes - elle n'est pas limitée au SESSION_CONTEXT() une fonction. Par exemple, vous pourriez obtenir la même erreur lors de l'utilisation de SUBSTRING() fonction.

Exemple d'erreur

Voici un exemple de code qui génère l'erreur :

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

Résultat :

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

Ici, j'ai passé une chaîne comme premier argument à SESSION_CONTEXT() , mais je ne l'ai pas préfixé avec N .

L'argument fourni à SESSION_CONTEXT() est la clé de la valeur récupérée. Il doit être de type sysname . C'est fondamentalement la même chose que nvarchar(128) NOT NULL , ce qui signifie que vous devez préfixer la chaîne littérale avec le N caractère.

La même erreur (Msg 8116) peut se produire dans de nombreux autres contextes - elle n'est pas limitée au SESSION_CONTEXT() fonction.

Dans tous les cas, cela signifie que vous transmettez le mauvais type de données à la fonction.

Solution

Pour résoudre le problème ci-dessus, tout ce que nous avons à faire est de préfixer la clé avec le N caractère :

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

Résultat :

English

Problème résolu. Tout ce que j'ai fait avec le changement 'language' en N'language' .

Comme mentionné, l'erreur 8116 n'est pas limitée au SESSION_CONTEXT() une fonction. Dans tous les cas, la solution est la même :assurez-vous que l'argument est d'un type de données accepté par la fonction.