Condividi tramite


sys.dm_exec_sql_text (Transact-SQL)

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure

Restituisce il testo del batch SQL identificato dal sql_handle specificato. 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 che ha 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 risiede nella cache dei piani o è attualmente in esecuzione. plan_handle is varbinary(64).

È possibile ottenere il plan_handle dagli oggetti a gestione dinamica seguenti:

Tabella restituita

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

Per SQL statico in una stored procedure, l'ID del database contenente la stored procedure. In caso contrario, il valore è NULL.
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.
Testo nvarchar(max ) Testo della query SQL.

Per gli oggetti crittografati viene restituito NULL.

Autorizzazioni

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

Autorizzazioni per SQL Server 2022 e versioni successive

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

Osservazioni:

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 per le query ad hoc. Per determinare il dbid per le query ad hoc, usare invece 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 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. Utilizzo di CROSS APPLY.
    Il sql_handle da sys.dm_exec_requests verrà passato a sys.dm_exec_sql_text utilizzando 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 diretto di sql_handle .
    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 a sys.dm_exec_requests. In questo esempio lo spid è 59. Passare quindi il 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 a gestione dinamica e DMV (Transact-SQL)
Funzioni e viste a gestione dinamica relative 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)
Utilizzo di APPLY
sys.dm_exec_text_query_plan (Transact-SQL)