共用方式為


使用工作階段內容資訊

工作階段內容資訊可讓應用程式設定多達 128 位元組的二進位值,以供在相同工作階段上作業的多個批次、預存程序、觸發程序或使用者自訂函數參考。您可以使用 SET CONTEXT_INFO 陳述式來設定工作階段內容值,並使用下列其中一項來擷取它:

  • CONTEXT_INFO 函數。

  • sys.dm_exec_requestssys.dm_exec_sessions 動態管理檢視,以及 sys.sysprocesses 相容性檢視中的 context_info 資料行。

工作階段內容資訊與 Transact-SQL 變數不同,它的範圍是限制成目前的 Transact-SQL 批次、預存程序、觸發程序或使用者自訂函數。工作階段內容資訊可用以儲存每個使用者的特定資訊或是應用程式目前的狀態。這可用以控制 Transact-SQL 陳述式中的邏輯。

CONTEXT_INFO 函數是預先定義的方法,用以擷取目前工作階段的工作階段內容。您也可以從 sys.dm_exec_requestssys.dm_exec_sessions 動態管理檢視中的 context_info 資料行,擷取所有目前工作階段及批次的工作階段內容值。若要從這些檢視選取將需要 SELECT 和 VIEW SERVER STATE 權限。當您使用 CONTEXT_INFO 函數時就不需要這些權限。

工作階段內容資訊的主要用途在於設定可在相同工作階段的多個批次之間保存的值。下列範例顯示如何設定可在執行數個批次後參考的值。

-- Set context information at start.
SET CONTEXT_INFO 0x125666698456;
GO
-- Perform several nonrelated batches.
EXEC sp_helpfile;
GO
USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE Name LIKE (N'Metal%')
ORDER BY ProductID;
GO
-- Select the context information set several batches earlier.
SELECT CONTEXT_INFO();
GO

工作階段內容資訊值

如果尚未針對目前的工作階段執行 SET CONTEXT_INFO,就會報告下列工作階段值:

  • CONTEXT_INFO 函數可以傳回 NULL。

  • 針對與目前的工作階段和要求關聯的資料列,在系統檢視中的 context_info 資料行值是設為 128 位元組的二進位零。

在執行 SET CONTEXT_INFO 後,就可立即使用下列來源的新值:

  • CONTEXT_INFO 函數:

    SELECT CONTEXT_INFO() AS MyCtxInfo;
    
  • 與目前的批次關聯之 sys.dm_exec_requests 資料列中的 context_info 資料行:

    SELECT context_info AS MyCtxInfo
    FROM sys.dm_exec_requests
    WHERE session_id = @@SPID
       AND request_id = CURRENT_REQUEST_ID();
    
  • 與目前之工作階段關聯的 sys.sysprocesses 資料列中的 context_info 資料行:

    SELECT context_info AS MyCtxInfo
    FROM sys.sysprocesses
    WHERE spid = @@SPID;
    

在包含 SET CONTEXT_INFO 陳述式的批次完成執行前,新值將不會傳播至 sys.dm_exec_sessions 檢視。當批次完成時,新值會放置在與目前工作階段關聯的資料列中。

SELECT context_info AS MyCtxInfo
FROM sys.dm_exec_sessions
WHERE session_id = @@SPID;

下列範例顯示新工作階段內容資訊值在系統檢視或 CONTEXT_INFO 函數中為可見的:

-- Set a context value before the batch starts.
SET CONTEXT_INFO 0x9999
GO
-- Set a new context value in the batch.
SET CONTEXT_INFO 0x8888

-- Shows the new value available in the
-- sys.dm_exec_requests view while still in the batch.
SELECT context_info as RequestCtxInfoInBatch
FROM sys.dm_exec_requests
WHERE session_id = @@SPID
   AND request_id = CURRENT_REQUEST_ID();

-- Shows the new value available from the
-- CONTEXT_INFO function while still in the batch.
SELECT CONTEXT_INFO() AS FuncCtxInfoInBatch;

-- Shows that the sys.dm_exec_sessions view still
-- returns the old value in the batch.
SELECT context_info AS SessCtxInfoInBatch
FROM sys.dm_exec_sessions
WHERE session_id = @@SPID;

-- Shows the new value available in the
-- sys.sysprocesses view while still in the batch.
SELECT context_info AS ProcsCtxInfoInBatch
FROM sys.sysprocesses
WHERE spid = @@SPID;

-- End the batch.
GO

-- Shows that the sys.dm_exec_sessions view now
-- returns the new value.
SELECT context_info AS SessCtxInfoAfterBatch
FROM sys.dm_exec_sessions
WHERE session_id = @@SPID;

工作階段內容資訊與 MARS

Multiple Active Result Set (MARS) 可讓應用程式在相同的連接中同時執行多個批次或要求。

當 MARS 連接的其中一個批次執行 SET CONTEXT_INFO 時,就可立即使用下列來源的新內容值:

  • 由設定值的相同批次所執行的 CONTEXT_INFO 函數。

  • 與設定值之批次關聯的 sys.dm_exec_requests 檢視中的資料列。

在設定值的批次完成執行前,新內容值將不會傳播至下列來源。

  • 由設定值之批次之外的批次所執行的 CONTEXT_INFO 函數。CONTEXT_INFO 只會傳回在設定值的批次完成後才開始的批次之新值。

  • 與設定值之批次關聯的 sys.dm_exec_sessions 檢視中的資料列。