sys.dm_exec_sql_text (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseAzure 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.
número smallint En un procedimiento almacenado numerado, esta columna devuelve el número del procedimiento almacenado. Para obtener más información, vea 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 VIEW SERVER PERFORMANCE STATE en el servidor.

Observaciones

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 un sql_handle directamente o con CROSS APPLY.

  1. 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';
    
  2. 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 es 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
    
  3. 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 es 59. 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 consultas principales por tiempo medio 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 APPLYsys.dm_exec_text_query_plan (Transact-SQL)