sys.dm_exec_sql_text (Transact-SQL)
Aplica-se a: SQL ServerBanco de Dados SQL do Azure Instância Gerenciada de SQL do Azure
Retorna o texto do lote SQL identificado pelo sql_handle especificado. Essa 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 é varbinário(64).
Os sql_handle podem ser obtidos 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(máx.) | Texto da consulta SQL. É NULL para objetos criptografados. |
Permissões
Requer a permissão VIEW SERVER STATE
no servidor.
Permissões do SQL Server 2022 e posteriores
É necessária 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 se originar 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
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.
Exemplos
R. Exemplo conceitual
Veja a seguir um exemplo básico para ilustrar a aprovação de um sql_handle diretamente ou com CROSS APPLY.
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';
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
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 é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. Obtenha 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 o sys.dm_exec_text_query_plan APPLY(Transact-SQL)