sys.dm_exec_sql_text (Transact-SQL)

Aplica-se a: simSQL Server (todas as versões compatíveis) SimBanco de Dados SQL do Azure

retorna o texto do SQL lote que é 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).

Os sql_handle podem ser obtidos nos seguintes objetos de gerenciamento dinâmico:

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

Os plan_handle podem ser obtidos nos seguintes objetos de gerenciamento dinâmico:

Tabela retornada

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

Para instruções SQL preparadas e ad hoc, a ID do banco de dados no qual as instruções foram compiladas.
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.
criptografados 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.

Comentários

para consultas ad hoc, os identificadores de SQL são valores de hash com base no SQL texto que está sendo enviado ao servidor e podem originar-se 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 a partir 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 direta 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.
    As sql_handle de Sys.dm_exec_requests serão passadas para Sys.DM_EXEC_SQL_TEXT usando a aplicação cruzada. Abra uma nova janela de consulta e passe o SPID identificado na etapa 1. Neste exemplo, o SPID é o caso 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 o 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 é o caso 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 (SQL Transact-)
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 aplicar
sys.dm_exec_text_query_plan (Transact-SQL)