sys.dm_exec_sql_text (Transact-SQL)
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance
Devuelve el texto del lote de SQL identificado por el sql_handle especificado. Esta función con valores de tabla reemplaza a la función del sistema fn_get_sql.
Sintaxis
sys.dm_exec_sql_text(sql_handle | plan_handle)
Argumentos
sql_handle
Es un token que identifica de forma única un lote que se ha ejecutado o que se está ejecutando actualmente. sql_handle es varbinary(64).
El sql_handle se puede obtener de los siguientes objetos de administración dinámica:
plan_handle
Es un token que identifica de forma exclusiva un plan de ejecución de consultas de un proceso por lotes que se ha ejecutado y cuyo plan reside en la caché del plan, o se está ejecutando actualmente. plan_handle es varbinary(64).
plan_handle puede obtenerse de los siguientes objetos de administración dinámica:
Tabla devuelta
Nombre de la columna | Tipo de datos | Descripción |
---|---|---|
dbid | smallint | Identificador de la base de datos. Para SQL estático en un procedimiento almacenado, el identificador de la base de datos que contiene el procedimiento almacenado. De lo contrario, es NULL. |
objectid | int | Identificador del objeto. Este valor es NULL para las instrucciones SQL ad hoc y preparadas. |
number | smallint | En un procedimiento almacenado numerado, esta columna devuelve el número del procedimiento almacenado. Para obtener más información, consulte sys.numbered_procedures (Transact-SQL). Este valor es NULL para las instrucciones SQL ad hoc y preparadas. |
encrypted | bit | 1 = El texto SQL está cifrado. 0 = El texto SQL no está cifrado. |
text | nvarchar(max ) | Texto de la consulta de SQL. Este valor es NULL para objetos cifrados. |
Permisos
Requiere el permiso VIEW SERVER STATE
en el servidor.
Permisos para SQL Server 2022 y versiones posteriores
Requiere el permiso VER ESTADO DE RENDIMIENTO DEL SERVIDOR en el servidor.
Comentarios
En el caso de las consultas ad hoc, los identificadores SQL son valores hash basados en el texto SQL que se envía al servidor y pueden originarse en cualquier base de datos.
Para los objetos de base de datos, como procedimientos almacenados, desencadenadores o funciones, los identificadores SQL se derivan del identificador de base de datos, del identificador de objeto y del número de objeto.
El identificador de plan es un valor hash derivado del plan compilado de todo el lote.
Nota:
dbid no se puede determinar a partir de sql_handle para consultas ad hoc. Para determinar dbid para consultas ad hoc, use plan_handle en su lugar.
Ejemplos
A Ejemplo conceptual
A continuación se muestra un ejemplo básico para ilustrar cómo pasar una sql_handle directamente o con CROSS APPLY.
Crear actividad.
Ejecute el siguiente T-SQL en una nueva ventana de consulta en SQL Server Management Studio.-- Identify current spid (session_id) SELECT @@SPID; GO -- Create activity WAITFOR DELAY '00:02:00';
Uso de CROSS APPLY.
El sql_handle de sys.dm_exec_requests se pasará a sys.dm_exec_sql_text mediante CROSS APPLY. Abra una nueva ventana de consulta y pase el spid identificado en el paso 1. En este ejemplo, el spid puede ser59
.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
Pasar sql_handle directamente.
Adquiera el sql_handle de sys.dm_exec_requests. A continuación, pase el sql_handle directamente a sys.dm_exec_sql_text. Abra una nueva ventana de consulta y pase el spid identificado en el paso 1 a sys.dm_exec_requests. En este ejemplo, el spid puede ser59
. A continuación, pase el sql_handle devuelto como argumento a 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. Obtención de información sobre las cinco principales consultas por promedio de tiempo de CPU
El ejemplo siguiente devuelve el texto de la instrucción SQL y el promedio de tiempo de CPU de las cinco mejores 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. Proporcionar estadísticas de ejecución por lotes
El ejemplo siguiente devuelve el texto de consultas SQL que se están ejecutando por lotes y proporciona información estadística sobre ellas.
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 también
Funciones y vistas de administración dinámica (Transact-SQL)
Funciones y vistas de administración dinámica relacionadas con ejecuciones (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)
Uso de APPLY
sys.dm_exec_text_query_plan (Transact-SQL)