[SQL SERVER]SQL2016-管理session context

以前使用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

 

參考

SESSION_CONTEXT

CONTEXT_INFO