Condividi tramite


sys.dm_exec_sql_text (Transact-SQL)

Restituisce il testo del batch SQL identificato dall'argomento 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
    Handle SQL del batch da cercare. sql_handle è di tipo varbinary(64). È possibile ottenere sql_handle dagli oggetti a gestione dinamica seguenti:

    • sys.dm_exec_query_stats

    • sys.dm_exec_requests

    • sys.dm_exec_cursors

    • sys.dm_exec_xml_handles

    • sys.dm_exec_query_memory_grants

    • sys.dm_exec_connections

  • plan_handle
    Identificatore del piano di query.

    Per ulteriori informazioni, vedere sys.dm_exec_text_query_plan (Transact-SQL).

Tabella restituita

Nome colonna

Tipo di dati

Descrizione

dbid

smallint

ID del database.

Per istruzioni SQL ad hoc e preparate viene restituito 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 ulteriori informazioni, vedere sys.numbered_procedures (Transact-SQL).

Per istruzioni SQL ad hoc e preparate viene restituito NULL.

encrypted

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 nel server.

Osservazioni

Per i batch gli handle SQL sono valori basati sul testo SQL. 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. handle_piano è un valore hash derivato dal piano compilato dell'intero batch.

Esempi

A. Recupero di informazioni sulle prime cinque query in base al tempo medio di 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;

B. Restituzione di statistiche di esecuzione dei 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;