sys.dm_exec_sql_text (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

返回由指定的 sql_handle标识的 SQL 批处理的文本。 该表值函数将替换系统函数 fn_get_sql

语法

sys.dm_exec_sql_text(sql_handle | plan_handle)  

参数

sql_handle
唯一标识已执行或当前正在执行的批处理的令牌。 sql_handlevarbinary (64)

可以从以下动态管理对象获取 sql_handle

plan_handle
一个标记,为已执行且其计划位于计划缓存中或当前正在执行的批次唯一标识查询执行计划。 plan_handle 是 varbinary(64)。

可以从下列动态管理对象中获得计划 plan_handle:

返回的表

列名称 数据类型 说明
dbid smallint 数据库的 ID。

对于存储过程中的静态 SQL,为包含存储过程的数据库的 ID。 否则为 Null。
objectid int 对象的 ID。

对于临时和预定义 SQL 语句为 NULL。
数字 smallint 对于带编号的存储过程,此列返回存储过程的编号。 有关详细信息,请参阅 sys.numbered_procedures (Transact-SQL)

对于临时和预定义 SQL 语句为 NULL。
encrypted bit 1 = SQL 文本已加密。

0 = SQL 文本未加密。
text nvarchar (max) SQL 查询的文本。

对于已加密对象为 NULL。

权限

要求具有对服务器的 VIEW SERVER STATE 权限。

SQL Server 2022 及更高版本的权限

需要对服务器具有 VIEW SERVER PERFORMANCE STATE 权限。

注解

对于即席查询,SQL 句柄是基于提交到服务器的 SQL 文本的哈希值,可以源自任何数据库。

对于诸如存储过程、触发器或函数之类的数据库对象,SQL 句柄派生自数据库 ID、对象 ID 和对象编号。

计划句柄是从整个批处理的已编译计划派生的哈希值。

注意

无法从临时查询的sql_handle确定 dbid。 若要确定临时查询的 dbid ,请改用 plan_handle

示例

A. 概念示例

下面是一个基本示例,演示如何直接或通过 CROSS APPLY 传递sql_handle

  1. 创建活动。
    在 SQL Server Management Studio 的新查询窗口中执行以下 T-SQL。

    -- Identify current spid (session_id)
    SELECT @@SPID;
    GO
    
    -- Create activity
      WAITFOR DELAY '00:02:00';
    
  2. 使用 CROSS APPLY
    来自 sys.dm_exec_requests 的sql_handle将使用 CROSS APPLY 传递给sys.dm_exec_sql_text。 打开一个新的查询窗口,并传递步骤 1 中标识的 spid。 在此示例中,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
    
  3. 直接传递 sql_handle
    sys.dm_exec_requests 获取 sql_handle。 然后,将 sql_handle 直接传递给 sys.dm_exec_sql_text。 打开一个新的查询窗口,并将步骤 1 中标识的 spid 传递到 sys.dm_exec_requests。 在此示例中,spid 恰好是 59。 然后将返回 的sql_handle 作为参数传递给 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. 按平均 CPU 时间获取有关前五个查询的信息

以下示例返回前五个查询的 SQL 语句文本和平均 CPU 时间。

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. 提供批处理执行统计信息

以下示例返回按批执行的 SQL 查询的文本,并提供有关它们的统计信息。

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;  

另请参阅

动态管理视图和函数 (Transact-SQL)
与执行有关的动态管理视图和函数 (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)
使用 APPLYsys.dm_exec_text_query_plan (Transact-SQL)