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.