Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Behebung von Msg 8116 „Argumentdatentyp varchar ist ungültig für Argument 1 der session_context-Funktion“ in SQL Server

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.