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ę.