Partilhar via


sys.dm_exec_sql_text (Transact-SQL)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

Devolve o texto do lote SQL que é identificado pelo sql_handle especificado. Esta função com valores de tabela substitui a função do sistema fn_get_sql.

Sintaxe

sys.dm_exec_sql_text(sql_handle | plan_handle)  

Arguments

sql_handle
É um token que identifica de forma única um lote que foi executado ou está atualmente a executar. sql_handle é varbinary(64).

A sql_handle pode ser obtida a partir dos seguintes objetos de gestão dinâmica:

plan_handle
É um token que identifica de forma única um plano de execução de consulta para um lote que foi executado e cujo plano reside na cache do plano, ou que está atualmente a ser executado. plan_handle é varbinary(64).

O plan_handle pode ser obtido a partir dos seguintes objetos de gerenciamento dinâmico:

Tabela retornada

Nome da coluna Tipo de dados Description
dbid smallint ID da base de dados.

Para SQL estático num procedimento armazenado, o ID da base de dados que contém o procedimento armazenado. Nulo caso contrário.
Objectid int ID do objeto.

É NULL para instruções SQL ad hoc e preparadas.
number smallint Para um procedimento armazenado numerado, esta coluna devolve o número do procedimento armazenado. Para mais informações, consulte sys.numbered_procedures (Transact-SQL).

É NULL para instruções SQL ad hoc e preparadas.
encriptado bit 1 = O texto SQL é encriptado.

0 = O texto SQL não está encriptado.
texto nvarchar(max) Texto da consulta SQL.

É NULL para objetos encriptados.

Permissions

Requer VIEW SERVER STATE permissão no servidor.

Permissões para SQL Server 2022 e posterior

Requer a permissão VIEW SERVER PERFORMANCE STATE no servidor.

Observações

Para consultas ad hoc, os handles SQL são valores de hash baseados no texto SQL submetido ao servidor, podendo originar-se de qualquer base de dados.

Para objetos de base de dados como procedimentos armazenados, triggers ou funções, os handles SQL são derivados do ID da base de dados, ID do objeto e número do objeto.

O handle de plano é um valor de hash derivado do plano compilado de todo o lote.

Observação

O dbid não pode ser determinado a partir de sql_handle para consultas ad hoc. Para determinar dbid para consultas ad hoc, use plan_handle em vez disso.

Examples

A. Exemplo Conceptual

Segue-se um exemplo básico para ilustrar a passagem de um sql_handle diretamente ou com CROSS APPLY.

  1. Crie atividade.
    Execute o seguinte T-SQL numa nova janela de consulta no SQL Server Management Studio.

    -- Identify current spid (session_id)
    SELECT @@SPID;
    GO
    
    -- Create activity
      WAITFOR DELAY '00:02:00';
    
  2. Usar CROSS APPLY.
    O sql_handle de sys.dm_exec_requests será passado para sys.dm_exec_sql_text usando CROSS APPLY. Abra uma nova janela de consulta e passe o spid identificado no passo 1. Neste exemplo, o 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. Passando sql_handle diretamente.
    Adquira a sql_handlede sys.dm_exec_requests. Depois, passa o sql_handle diretamente ao sys.dm_exec_sql_text. Abra uma nova janela de consulta e passe o spid identificado no passo 1 para sys.dm_exec_requests. Neste exemplo, o spid é .59 Depois passa o sql_handle devolvido como argumento para 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. Obtenha informações sobre as cinco principais consultas por tempo médio de CPU

O exemplo seguinte devolve o texto da instrução SQL e o tempo médio de CPU para as cinco consultas principais.

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. Fornecer estatísticas de execução em lote

O exemplo seguinte devolve o texto das consultas SQL que estão a ser executadas em lotes e fornece informação estatística sobre elas.

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;  

Consulte também

Visualizações e funções de gerenciamento dinâmico (Transact-SQL)
Visualizações e funções de gerenciamento dinâmico relacionadas à execução (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)
Utilização do APPLY
sys.dm_exec_text_query_plan (Transact-SQL)