sys.dm_exec_sql_text (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do Azure

Retorna o texto do lote SQL identificado pelo sql_handle especificado. Esta função com valor de tabela substitui a função do sistema fn_get_sql.

Sintaxe

sys.dm_exec_sql_text(sql_handle | plan_handle)  

Argumentos

sql_handle
É um token que identifica exclusivamente um lote que foi executado ou está em execução no momento. sql_handle é varbinary(64).

O sql_handle pode ser obtido dos seguintes objetos de gerenciamento dinâmico:

plan_handle
É um token que identifica exclusivamente um plano de execução de consulta de um lote que foi executado e o plano reside no cache de plano ou está em execução no momento. plan_handle é varbinary(64).

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

Tabela retornada

Nome da coluna Tipo de dados Descrição
dbid smallint ID do banco de dados.

Para SQL estático em um procedimento armazenado, a ID do banco de dados que contém o procedimento armazenado. Do contrário, nulo.
objectid int ID do objeto.

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

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

0 = O texto SQL não é criptografado.
text nvarchar(max) Texto da consulta SQL.

É NULL para objetos criptografados.

Permissões

Requer a permissão VIEW SERVER STATE no servidor.

Permissões para SQL Server 2022 e posterior

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

Comentários

Para consultas ad hoc, os identificadores SQL são valores de hash com base no texto SQL que está sendo enviado ao servidor e podem ser originados de qualquer banco de dados.

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

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

Observação

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

Exemplos

a. Exemplo conceitual

Veja a seguir um exemplo básico para ilustrar a passagem de um sql_handle diretamente ou com CROSS APPLY.

  1. Criar atividade.
    Execute o T-SQL a seguir em uma 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. Usando 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 na etapa 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 o sql_handle de sys.dm_exec_requests. Em seguida, passe a sql_handle diretamente para sys.dm_exec_sql_text. Abra uma nova janela de consulta e passe o spid identificado na etapa 1 para sys.dm_exec_requests. Neste exemplo, o spid é 59. Em seguida, passe o sql_handle retornado como um 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. Obter informações sobre as cinco principais consultas por tempo médio de CPU

O exemplo a seguir retorna o texto da instrução SQL e o tempo médio de CPU das cinco primeiras consultas.

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 a seguir retorna o texto de consultas SQL que estão sendo executadas em lotes e fornece informações estatísticas 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;  

Confira também

Exibições e funções de gerenciamento dinâmico (Transact-SQL)
Funções e exibiçõ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)
Usando APPLYsys.dm_exec_text_query_plan (Transact-SQL)