以前使用CONTEXT_INFO管理session,SQL2016卻改用SESSION_CONTEXT,
SESSION_CONTEXT有解決什麼問題呢?
使用SQL Server儲存session context需求滿常見的,
好比儲存使用者識別資料(又或是其他你想保留的資料),
即便使用者都透過web或中介層應用程式連接SQL Server。
以前使用CONTEXT_INFO大概有以下幾個誇張問題
1.每條連線,內容最大限制為128 bytes(你沒看錯這誇張限制)。
2.Azure SQL Database和地端SQL處理不太相同
(Azure SQL Database如果沒有設定內容,則返回隨機GUID)。
3.使用binary來處理,過程繁瑣又不明確。
SESSION_CONTEXT改善了一些誇張限制
1每條連線,內容最大限制為256K。
2 Azure SQL Database和地端SQL處理機制依樣,只要沒設定內容,一律返回null。
3 支援key-value,遠比單一binary好太多。
現在我簡單來示範SESSION_CONTEXT幾個應用
設定session變數
DECLARE @UserID varchar(10) = 'RiCo';
EXEC sys.sp_set_session_context @key = N'UserID', @value = @UserID;
--注意N 不可忽略
SELECT SESSION_CONTEXT(N'UserID'); --ok
SELECT SESSION_CONTEXT('UserID'); --error
忽略N則會發生參數資料型別錯誤
設定唯讀session變數
DECLARE @UserID varchar(10) = 'RiCo';
EXEC sys.sp_set_session_context @key = N'UserID', @value = @UserID, @read_only = 1;
--嘗試更新變數內容
EXEC sys.sp_set_session_context @key = N'UserID', @value = 'Sherry';
session變數串連
單純使用 + 會發生sql_variant不相容操作
EXEC sys.sp_set_session_context @key = N'UserID', @value = N'rico';
EXEC sys.sp_set_session_context @key = N'Age', @value = 35;
SELECT SESSION_CONTEXT(N'UserID') + SESSION_CONTEXT(N'Age');
必須明確轉換正確資料型別才可串連變數
EXEC sys.sp_set_session_context @key = N'UserID', @value = N'rico';
EXEC sys.sp_set_session_context @key = N'Age', @value = 35;
--必須明確轉換資料型別才可串連變數
SELECT CONCAT(
CONVERT(NVARCHAR(4000),SESSION_CONTEXT(N'UserID')),N':',
CONVERT(NVARCHAR(4000),SESSION_CONTEXT(N'Age'))
);
Enjoy SQL Server 2016
參考