Wenn Sie die SQL Server-Fehlermeldung 8116 mit der Meldung Argument data type varchar is invalid for argument 1 of session_context function erhalten , liegt es daran, dass Sie einer Funktion den falschen Datentyp übergeben – in diesem Fall SESSION_CONTEXT()
Funktion.
Dies kann passieren, wenn Sie ein Zeichenfolgenliteral an SESSION_CONTEXT()
übergeben Funktion, ohne ihr das N
voranzustellen Zeichen.
Derselbe Fehler (Msg 8116) kann auch in anderen Kontexten auftreten – er ist nicht auf SESSION_CONTEXT()
beschränkt Funktion. Beispielsweise könnten Sie denselben Fehler erhalten, wenn Sie SUBSTRING()
verwenden Funktion.
Beispiel für den Fehler
Hier ist ein Codebeispiel, das den Fehler erzeugt:
EXEC sp_set_session_context
@key = 'language',
@value = 'English';
SELECT SESSION_CONTEXT('language');
Ergebnis:
Msg 8116, Level 16, State 1, Line 4 Argument data type varchar is invalid for argument 1 of session_context function.
Hier habe ich einen String als erstes Argument an SESSION_CONTEXT()
übergeben , aber ich habe ihm nicht N
vorangestellt .
Das für SESSION_CONTEXT()
bereitgestellte Argument ist der Schlüssel des abgerufenen Werts. Er muss vom Typ sysname
sein . Dies ist im Grunde dasselbe wie nvarchar(128) NOT NULL
, was bedeutet, dass Sie dem Zeichenfolgenliteral das N
voranstellen müssen Zeichen.
Derselbe Fehler (Msg 8116) kann in vielen anderen Kontexten auftreten – er ist nicht auf SESSION_CONTEXT()
beschränkt Funktion.
In jedem Fall bedeutet dies, dass Sie der Funktion den falschen Datentyp übergeben.
Lösung
Um das obige Problem zu lösen, müssen wir dem Schlüssel lediglich das N
voranstellen Zeichen:
EXEC sp_set_session_context
@key = 'language',
@value = 'English';
SELECT SESSION_CONTEXT(N'language');
Ergebnis:
English
Problem gelöst. Alles, was ich getan habe, ist 'language'
zu ändern zu N'language'
.
Wie bereits erwähnt, ist Fehler 8116 nicht auf SESSION_CONTEXT()
beschränkt Funktion. In beiden Fällen ist die Lösung dieselbe – stellen Sie sicher, dass das Argument einen Datentyp hat, den die Funktion akzeptiert.