Jeśli otrzymujesz komunikat o błędzie SQL Server 8116 z komunikatem Typ danych argumentu varchar jest nieprawidłowy dla argumentu 1 funkcji session_context , to dlatego, że przekazujesz niewłaściwy typ danych do funkcji – w tym przypadku SESSION_CONTEXT()
funkcja.
Może się to zdarzyć, jeśli przekażesz literał ciągu do SESSION_CONTEXT()
funkcja bez przedrostka N
znak.
Ten sam błąd (Msg 8116) może również wystąpić w innych kontekstach – nie ogranicza się do SESSION_CONTEXT()
funkcjonować. Na przykład możesz otrzymać ten sam błąd podczas korzystania z SUBSTRING()
funkcja.
Przykład błędu
Oto przykład kodu, który generuje błąd:
EXEC sp_set_session_context
@key = 'language',
@value = 'English';
SELECT SESSION_CONTEXT('language');
Wynik:
Msg 8116, Level 16, State 1, Line 4 Argument data type varchar is invalid for argument 1 of session_context function.
Tutaj przekazałem ciąg znaków jako pierwszy argument do SESSION_CONTEXT()
, ale nie poprzedziłem go przedrostkiem N
.
Argument dostarczony do SESSION_CONTEXT()
jest kluczem pobieranej wartości. Musi być typu sysname
. Jest to w zasadzie to samo co nvarchar(128) NOT NULL
, co oznacza, że musisz poprzedzić literał ciągu znakiem N
znak.
Ten sam błąd (Msg 8116) może wystąpić w wielu innych kontekstach – nie ogranicza się do SESSION_CONTEXT()
funkcja.
Tak czy inaczej, oznacza to, że przekazujesz do funkcji niewłaściwy typ danych.
Rozwiązanie
Aby rozwiązać powyższy problem, wystarczy poprzedzić klucz N
charakter:
EXEC sp_set_session_context
@key = 'language',
@value = 'English';
SELECT SESSION_CONTEXT(N'language');
Wynik:
English
Problem rozwiązany. Wszystko, co zrobiłem ze zmianą 'language'
na N'language'
.
Jak wspomniano, błąd 8116 nie ogranicza się do SESSION_CONTEXT()
funkcjonować. Tak czy inaczej, rozwiązanie jest takie samo – upewnij się, że argument jest typu danych akceptowanego przez funkcję.