Als u SQL Server-foutbericht 8116 krijgt met het bericht Argumentgegevenstype varchar is ongeldig voor argument 1 van de session_context-functie , is dat omdat u het verkeerde gegevenstype aan een functie doorgeeft - in dit geval de SESSION_CONTEXT()
functie.
Dit kan gebeuren als u een letterlijke tekenreeks doorgeeft aan de SESSION_CONTEXT()
functie zonder deze vooraf te laten gaan door de N
karakter.
Dezelfde fout (Msg 8116) kan ook in andere contexten voorkomen – het is niet beperkt tot de SESSION_CONTEXT()
functie. U kunt bijvoorbeeld dezelfde foutmelding krijgen bij het gebruik van de SUBSTRING()
functie.
Voorbeeld van de fout
Hier is een voorbeeld van code die de fout veroorzaakt:
EXEC sp_set_session_context
@key = 'language',
@value = 'English';
SELECT SESSION_CONTEXT('language');
Resultaat:
Msg 8116, Level 16, State 1, Line 4 Argument data type varchar is invalid for argument 1 of session_context function.
Hier heb ik een string als het eerste argument doorgegeven aan SESSION_CONTEXT()
, maar ik heb het niet voorafgegaan door N
.
Het argument geleverd aan SESSION_CONTEXT()
is de sleutel van de waarde die wordt opgehaald. Het moet van het type sysname
. zijn . Dit is in principe hetzelfde als nvarchar(128) NOT NULL
, wat betekent dat je de letterlijke tekenreeks moet voorvoegen met de N
karakter.
Dezelfde fout (bericht 8116) kan in veel andere contexten voorkomen - het is niet beperkt tot de SESSION_CONTEXT()
functie.
Hoe dan ook, het betekent dat je het verkeerde gegevenstype aan de functie doorgeeft.
Oplossing
Om het bovenstaande probleem op te lossen, hoeven we alleen de sleutel vooraf te laten gaan door de N
karakter:
EXEC sp_set_session_context
@key = 'language',
@value = 'English';
SELECT SESSION_CONTEXT(N'language');
Resultaat:
English
Probleem opgelost. Alles wat ik deed met het wijzigen van 'language'
naar N'language'
.
Zoals vermeld, is fout 8116 niet beperkt tot de SESSION_CONTEXT()
functie. Hoe dan ook, de oplossing is hetzelfde - zorg ervoor dat het argument van een gegevenstype is dat de functie accepteert.