Nếu bạn gặp lỗi Máy chủ SQL Msg 8116 với thông báo Kiểu dữ liệu đối số varchar không hợp lệ cho đối số 1 của hàm session_context , đó là do bạn đang chuyển sai loại dữ liệu cho một hàm - trong trường hợp này là SESSION_CONTEXT()
chức năng.
Điều này có thể xảy ra nếu bạn chuyển một chuỗi ký tự vào SESSION_CONTEXT()
hàm mà không cần đặt tiền tố bằng N
nhân vật.
Lỗi tương tự (Msg 8116) cũng có thể xảy ra trong các ngữ cảnh khác - nó không giới hạn ở SESSION_CONTEXT()
hàm số. Ví dụ:bạn có thể gặp lỗi tương tự khi sử dụng SUBSTRING()
chức năng.
Ví dụ về lỗi
Dưới đây là một ví dụ về mã tạo ra lỗi:
EXEC sp_set_session_context
@key = 'language',
@value = 'English';
SELECT SESSION_CONTEXT('language');
Kết quả:
Msg 8116, Level 16, State 1, Line 4 Argument data type varchar is invalid for argument 1 of session_context function.
Ở đây, tôi đã chuyển một chuỗi làm đối số đầu tiên cho SESSION_CONTEXT()
, nhưng tôi không đặt tiền tố nó bằng N
.
Đối số được cung cấp cho SESSION_CONTEXT()
là khóa của giá trị đang được truy xuất. Nó phải thuộc loại sysname
. Điều này về cơ bản giống với nvarchar(128) NOT NULL
, có nghĩa là bạn cần đặt tiền tố chuỗi ký tự bằng N
nhân vật.
Lỗi tương tự (Msg 8116) có thể xảy ra trong nhiều ngữ cảnh khác - nó không giới hạn ở SESSION_CONTEXT()
chức năng.
Dù bằng cách nào, điều đó có nghĩa là bạn đang chuyển sai loại dữ liệu cho hàm.
Giải pháp
Để giải quyết vấn đề trên, tất cả những gì chúng ta cần làm là đặt tiền tố cho khóa bằng N
nhân vật:
EXEC sp_set_session_context
@key = 'language',
@value = 'English';
SELECT SESSION_CONTEXT(N'language');
Kết quả:
English
Vấn đề đã được giải quyết. Tất cả những gì tôi đã làm với thay đổi 'language'
sang N'language'
.
Như đã đề cập, lỗi 8116 không giới hạn ở SESSION_CONTEXT()
hàm số. Dù bằng cách nào thì giải pháp cũng giống nhau - đảm bảo rằng đối số thuộc kiểu dữ liệu mà hàm chấp nhận.