sys.dm_exec_sql_text (Transact-SQL)

Devuelve el texto del lote SQL que se identifica mediante el valor 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 el identificador SQL del lote que se va a buscar. sql_handle es de tipo varbinary(64). sql_handle se puede obtener de los siguientes objetos de administración dinámica:

    • sys.dm_exec_query_stats

    • sys.dm_exec_requests

    • sys.dm_exec_cursors

    • sys.dm_exec_xml_handles

    • sys.dm_exec_query_memory_grants

    • sys.dm_exec_connections

  • plan_handle
    Es el identificador del plan de consulta.

    Para obtener más información, vea sys.dm_exec_text_query_plan (Transact-SQL).

Tabla devuelta

Nombre de columna

Tipo de datos

Descripción

dbid

smallint

Id. de la base de datos.

Este valor es NULL para las instrucciones SQL ad hoc y preparadas.

objectid

int

Id. 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.

Notas

En lotes, los identificadores de SQL son valores de hash basados en el texto SQL. 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. plan_handle es un valor hash derivado del plan compilado del lote completo.

Ejemplos

A. Obtener información sobre las cinco mejores 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;

B. Proporcionar estadísticas de ejecución de 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;