Trong SQL Server, bạn có thể sử dụng SESSION_CONTEXT()
hàm để đọc giá trị của một khóa được chỉ định trong ngữ cảnh phiên hiện tại.
Khóa (cặp khóa / giá trị) cần được đặt trước. Điều này có thể được thực hiện với sp_set_session_context
thủ tục được lưu trữ.
Sau khi một cặp khóa / giá trị đã được đặt cho phiên, bạn có thể sử dụng SESSION_CONTEXT()
để trả về giá trị của khóa đó.
Ví dụ 1 - Đặt &Trả lại Giá trị
Dưới đây là một ví dụ minh họa khái niệm và cách sử dụng cơ bản.
EXEC sp_set_session_context @key =N'user_id ', @value =15; CHỌN SESSION_CONTEXT (N'user_id') AS user_id;
Kết quả:
+ ----------- + | user_id || ----------- || 15 | + ----------- +
Ví dụ 2 - Khi một khóa không tồn tại
Đây là điều sẽ xảy ra nếu bạn cố gắng lấy giá trị từ một khóa không tồn tại.
SELECT SESSION_CONTEXT (N'oops ') AS oops;
Kết quả:
+ -------- + | oops || -------- || NULL | + -------- +
Ví dụ 3 - Tiền tố “N”
Đối số được cung cấp cho SESSION_CONTEXT()
thuộc loại sysname . Về cơ bản, điều này giống với nvarchar(128) NOT NULL
, có nghĩa là bạn cần đặt trước đối số bằng N
nhân vật.
Đây là những gì sẽ xảy ra nếu tôi xóa N
tiền tố:
EXEC sp_set_session_context @key ='language', @value ='English'; SELECT SESSION_CONTEXT ('language') AS ngôn ngữ;
Kết quả:
Msg 8116, Mức 16, Trạng thái 1, Dòng 5 Kiểu dữ liệu đối số varchar không hợp lệ cho đối số 1 của hàm session_context.
Bằng cách xóa N
tiền tố, tôi chỉ đơn giản là chuyển vào varchar , khi nó phải là nvarchar (hoặc sysname chinh xac).
Đây là với N
tiền tố:
EXEC sp_set_session_context @key =N'language ', @value =' English '; SELECT SESSION_CONTEXT (N'language') AS ngôn ngữ;
Kết quả:
+ ------------ + | tiếng || ------------ || Tiếng Anh | + ------------ +
Ví dụ 4 - Giá trị trả lại
Loại trả về của SESSION_CONTEXT()
là sql_variant .
Bạn có thể sử dụng SQL_VARIANT_PROPERTY()
để tìm ra loại cơ sở.
Ví dụ:
SELECT SQL_VARIANT_PROPERTY (SESSION_CONTEXT (N'user_id '),' BaseType ') AS user_id, SQL_VARIANT_PROPERTY (SESSION_CONTEXT (N'language'), 'BaseType') AS ngôn ngữ;
Kết quả:
+ ----------- + ------------ + | user_id | tiếng || ----------- + ------------ || int | varchar | + ----------- + ------------ +
Ví dụ 5 - Kết hợp các giá trị trả lại
Nếu bạn cần nối nhiều kết quả, bạn sẽ cần chuyển đổi kết quả sang loại dữ liệu khác với sql_variant Đầu tiên.
Dưới đây là một ví dụ về điều gì sẽ xảy ra nếu tôi không làm điều này:
Ví dụ:
EXEC sp_set_session_context N'user_fname ',' Homer '; EXEC sp_set_session_context N'user_lname', 'Simpson'; SELECT CONCAT (SESSION_CONTEXT (N'user_fname '), SESSION_CONTEXT (N'user_lname')) AS Kết quả;>Kết quả:
Msg 257, Mức 16, Trạng thái 3, Dòng 1 Không cho phép chuyển đổi rõ ràng từ kiểu dữ liệu sql_variant sang varchar. Sử dụng hàm CHUYỂN ĐỔI để chạy truy vấn này.Vì vậy, tôi cần chuyển đổi kết quả một cách rõ ràng bằng cách sử dụng
CAST()
hoặcCONVERT()
trước khi nối chúng.Ví dụ:
EXEC sp_set_session_context N'user_fname ',' Homer '; EXEC sp_set_session_context N'user_lname', 'Simpson'; CHỌN CONCAT (CAST (SESSION_CONTEXT (N'user_fname ') AS varchar (5)), CAST (SESSION_CONTEXT (SESSION_CONTEXT) user_lname ') AS varchar (7))) AS Kết quả;Kết quả:
+ -------------- + | Kết quả || -------------- || HomerSimpson | + -------------- +