sys.dm_exec_sql_text (Transact-SQL)

Retorna o texto do lote SQL 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
    É o identificador SQL do lote a ser pesquisado. sql_handle é varbinary(64). sql_handle pode ser obtido dos seguintes objetos de gerenciamento dinâmico:

    • sys.dm_exec_query_stats

    • sys.dm_exec_requests

    • sys.dm_exec_cursors

    • sys.dm_exec_xml_handles

    • sys.dm_exec_query_memory_grants (Transact-SQL)

    • sys.dm_exec_connections (Transact-SQL)

  • plan_handle
    É um identificador para o plano de consulta.

    Para obter mais informações, consulte sys.dm_exec_text_query_plan (Transact-SQL).

Tabela retornada

Nome da coluna

Tipo de dados

Descrição

dbid

smallint

ID do banco de dados.

É NULL para instruções SQL ad hoc e preparadas.

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.

Comentários

Para lotes, os identificadores SQL são valores de hash baseados no texto SQL. Para objetos de banco de dados, como procedimentos armazenados, gatilhos ou funções, os identificadores SQL são derivados do ID de banco de dados, ID de objeto e número de objeto. plan_handle é um valor de hash derivado do plano compilado do lote inteiro.

Exemplos

A. Obtendo informações sobre as cinco primeiras 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;

B. Fornecendo estatísticas de execução em lotes

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;