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;
Consulte também