sys.dm_exec_sql_text (Transact-SQL)

Si applica a: sìSQL Server (tutte le versioni supportate) Sìdatabase SQL di Azure

Restituisce il testo del SQL batch identificato dall'oggetto sql_handle. Questa funzione con valori di tabella sostituisce la funzione di sistema fn_get_sql.

Sintassi

sys.dm_exec_sql_text(sql_handle | plan_handle)  

Argomenti

sql_handle
Token che identifica in modo univoco un batch eseguito o attualmente in esecuzione. sql_handle è varbinary(64).

Il sql_handle può essere ottenuto dagli oggetti a gestione dinamica seguenti:

plan_handle
Token che identifica in modo univoco un piano di esecuzione di query per un batch eseguito e il relativo piano si trova nella cache dei piani o è attualmente in esecuzione. plan_handle è varbinary(64).

Il plan_handle può essere ottenuto dagli oggetti a gestione dinamica seguenti:

Tabella restituita

Nome colonna Tipo di dati Descrizione
Dbid smallint ID del database.

Per istruzioni SQL ad hoc e preparate, l'ID del database in cui sono state compilate le istruzioni.
objectid int ID dell'oggetto.

Per istruzioni SQL ad hoc e preparate viene restituito NULL.
number smallint Per una stored procedure numerata, questa colonna restituisce il numero della stored procedure. Per altre informazioni, vedere sys.numbered_procedures (Transact-SQL).

Per istruzioni SQL ad hoc e preparate viene restituito NULL.
Crittografato bit 1 = Il testo SQL è crittografato.

0 = Il testo SQL non è crittografato.
text nvarchar(max ) Testo della query SQL.

Per gli oggetti crittografati viene restituito NULL.

Autorizzazioni

È richiesta l'autorizzazione VIEW SERVER STATE per il server.

Commenti

Per le query ad hoc, gli handle SQL sono valori hash basati sul testo SQL inviato al server e possono provenire da qualsiasi database.

Per alcuni oggetti di database, ad esempio stored procedure, trigger o funzioni, gli handle SQL sono derivati dall'ID di database e dall'ID e dal numero dell'oggetto.

L'handle di piano è un valore hash derivato dal piano compilato dell'intero batch.

Nota

Non è possibile determinare dbid da sql_handle query ad hoc. Per determinare dbid per le query ad hoc, usare plan_handle .

Esempi

R. Esempio concettuale

Di seguito è riportato un esempio di base per illustrare il passaggio di un sql_handle direttamente o con CROSS APPLY.

  1. Creare un'attività.
    Eseguire il codice T-SQL seguente in una nuova finestra di query in SQL Server Management Studio.

    -- Identify current spid (session_id)
    SELECT @@SPID;
    GO
    
    -- Create activity
      WAITFOR DELAY '00:02:00';
    
  2. Uso di CROSS APPLY.
    Il sql_handle da sys.dm_exec_requests verrà passato a sys.dm_exec_sql_text tramite CROSS APPLY. Aprire una nuova finestra di query e passare lo spid identificato nel passaggio 1. In questo esempio lo spid è 59.

    SELECT t.*
    FROM sys.dm_exec_requests AS r
    CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS t
    WHERE session_id = 59 -- modify this value with your actual spid
    
  3. Passaggio sql_handle direttamente.
    Acquisire il sql_handle da sys.dm_exec_requests. Passare quindi il sql_handle direttamente a sys.dm_exec_sql_text. Aprire una nuova finestra di query e passare lo spid identificato nel passaggio 1 sys.dm_exec_requests. In questo esempio lo spid è 59. Passare quindi l'sql_handle restituito come argomento a sys.dm_exec_sql_text.

    -- acquire sql_handle
    SELECT sql_handle FROM sys.dm_exec_requests WHERE session_id = 59  -- modify this value with your actual spid
    
    -- pass sql_handle to sys.dm_exec_sql_text
    SELECT * FROM sys.dm_exec_sql_text(0x01000600B74C2A1300D2582A2100000000000000000000000000000000000000000000000000000000000000) -- modify this value with your actual sql_handle
    

B. Ottenere informazioni sulle prime cinque query in base al tempo medio della CPU

Nell'esempio seguente vengono restituiti il testo dell'istruzione SQL e il tempo medio di CPU per le prime cinque query.

SELECT TOP 5 total_worker_time/execution_count AS [Avg CPU Time],  
    SUBSTRING(st.text, (qs.statement_start_offset/2)+1,   
        ((CASE qs.statement_end_offset  
          WHEN -1 THEN DATALENGTH(st.text)  
         ELSE qs.statement_end_offset  
         END - qs.statement_start_offset)/2) + 1) AS statement_text  
FROM sys.dm_exec_query_stats AS qs  
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st  
ORDER BY total_worker_time/execution_count DESC;  

C. Fornire statistiche di esecuzione batch

Nell'esempio seguente viene restituito il testo delle query SQL eseguite in batch e vengono visualizzate le relative informazioni statistiche.

SELECT s2.dbid,   
    s1.sql_handle,    
    (SELECT TOP 1 SUBSTRING(s2.text,statement_start_offset / 2+1 ,   
      ( (CASE WHEN statement_end_offset = -1   
         THEN (LEN(CONVERT(nvarchar(max),s2.text)) * 2)   
         ELSE statement_end_offset END)  - statement_start_offset) / 2+1))  AS sql_statement,  
    execution_count,   
    plan_generation_num,   
    last_execution_time,     
    total_worker_time,   
    last_worker_time,   
    min_worker_time,   
    max_worker_time,  
    total_physical_reads,   
    last_physical_reads,   
    min_physical_reads,    
    max_physical_reads,    
    total_logical_writes,   
    last_logical_writes,   
    min_logical_writes,   
    max_logical_writes    
FROM sys.dm_exec_query_stats AS s1   
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2    
WHERE s2.objectid is null   
ORDER BY s1.sql_handle, s1.statement_start_offset, s1.statement_end_offset;  

Vedi anche

Funzioni e viste a gestione dinamica (Transact-SQL)
Funzioni e viste a gestione dinamica correlate all'esecuzione (Transact-SQL)
sys.dm_exec_query_stats (Transact-SQL)
sys.dm_exec_requests (Transact-SQL)
sys.dm_exec_cursors (Transact-SQL)
sys.dm_exec_xml_handles (Transact-SQL)
sys.dm_exec_query_memory_grants (Transact-SQL)
Uso di APPLY
sys.dm_exec_text_query_plan (Transact-SQL)