Utilizzo delle informazioni sul contesto di sessione
Le informazioni sul contesto di sessione consentono alle applicazioni di impostare valori binari fino a 128 byte, ai quali è possibile fare riferimento in più batch, stored procedure, trigger o funzioni definite dall'utente utilizzate nella stessa sessione. È possibile impostare un valore di contesto di sessione utilizzando l'istruzione SET CONTEXT_INFO e recuperarlo utilizzando uno degli elementi seguenti:
La funzione CONTEXT_INFO.
Le colonne context_info nelle viste a gestione dinamica sys.dm_exec_requests e sys.dm_exec_sessions e la vista di compatibilità sys.sysprocesses.
Le informazioni sul contesto di sessione sono diverse dalle variabili Transact-SQL, in quanto l'ambito di queste ultime è limitato al batch, alla stored procedure, al trigger o alla funzione definita dall'utente corrente di Transact-SQL. Le informazioni sul contesto di sessione possono essere utilizzate per archiviare informazioni specifiche per ogni utente o lo stato corrente dell'applicazione. Quest'ultimo è quindi utilizzabile per controllare la logica nelle istruzioni Transact-SQL.
La funzione CONTEXT_INFO è il modo consigliato per recuperare il contesto di sessione per la sessione corrente. È inoltre possibile recuperare i valori del contesto di sessione per tutte le sessioni e i batch correnti dalle colonne CONTEXT_INFO nelle viste a gestione dinamica sys.dm_exec_requests oppure sys.dm_exec_sessions. Per eseguire selezioni da queste viste sono necessarie le autorizzazioni SELECT e VIEW SERVER STATE. Queste autorizzazioni non sono necessarie quando si utilizza la funzione CONTEXT_INFO.
L'utilizzo primario delle informazioni sul contesto di sessione è l'impostazione di un valore che può essere reso persistente su più batch nella stessa sessione. Nell'esempio seguente viene illustrata l'impostazione di un valore cui può essere fatto riferimento dopo l'esecuzione di vari batch.
-- 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
Valori delle informazioni sul contesto di sessione
Se SET CONTEXT_INFO non è stata ancora eseguita per la sessione corrente, vengono indicati i valori di sessione seguenti:
La funzione CONTEXT_INFO restituisce NULL.
I valori della colonna context_info nelle viste di sistema sono impostati su 128 byte di zero binari per le righe associate alla sessione e alla richiesta correnti.
Dopo l'esecuzione di SET CONTEXT_INFO, il nuovo valore è immediatamente disponibile dalle origini seguenti:
La funzione CONTEXT_INFO:
SELECT CONTEXT_INFO() AS MyCtxInfo;
La colonna context_info nella riga sys.dm_exec_requests associata al batch corrente:
SELECT context_info AS MyCtxInfo FROM sys.dm_exec_requests WHERE session_id = @@SPID AND request_id = CURRENT_REQUEST_ID();
La colonna context_info nella riga sys.sysprocesses associata alla sessione corrente:
SELECT context_info AS MyCtxInfo FROM sys.sysprocesses WHERE spid = @@SPID;
Il nuovo valore non viene trasmesso alla vista sys.dm_exec_sessions finché non è terminata l'esecuzione del batch che include l'istruzione SET CONTEXT_INFO. Quando il batch termina, il nuovo valore viene inserito nella riga associata alla sessione corrente.
SELECT context_info AS MyCtxInfo
FROM sys.dm_exec_sessions
WHERE session_id = @@SPID;
Nell'esempio seguente viene illustrato quando un nuovo valore di informazioni sul contesto di sessione viene visualizzato nelle viste di sistema oppure nella funzione 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;
Informazioni sul contesto di sessione e MARS
Più set di risultati attivi (MARS) attivano l'esecuzione, da parte delle applicazioni, di più batch o richieste, contemporaneamente sulla stessa connessione.
Quando uno dei batch su una connessione MARS esegue SET CONTEXT_INFO, il nuovo valore di contesto è immediatamente disponibile dalle origini seguenti:
Dalla funzione CONTEXT_INFO eseguita dallo stesso batch che ha impostato il valore.
La riga nella vista sys.dm_exec_requests associata al batch che ha impostato il valore.
Il nuovo valore di contesto non viene trasmesso alle origini seguenti finché non è terminata l'esecuzione del batch che imposta il valore:
La funzione CONTEXT_INFO eseguita da un batch diverso da quello che ha impostato il valore. CONTEXT_INFO restituisce solo il nuovo valore nei batch avviati dopo il completamento del batch che ha impostato il valore.
La riga nella vista sys.dm_exec_sessions associata al batch che ha impostato il valore.