sys.dm_exec_sql_text (Transact-SQL)

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

语法

sys.dm_exec_sql_text(sql_handle | plan_handle)

参数

  • sql_handle
    要查找的批处理的 SQL 句柄。sql_handle 的数据类型为 varbinary(64)。可以从以下动态管理对象中获得 sql_handle:

    • 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
    查询计划的标识符。

    有关详细信息,请参阅 sys.dm_exec_text_query_plan

返回的表

列名

数据类型

说明

dbid

smallint

数据库的 ID。

对于临时和预定义 SQL 语句为 NULL。

objectid

int

对象的 ID。

对于临时和预定义 SQL 语句为 NULL。

number

smallint

对于带编号的存储过程,此列返回存储过程的编号。有关详细信息,请参阅 sys.numbered_procedures (Transact-SQL)

对于临时和预定义 SQL 语句为 NULL。

encrypted

bit

1 = SQL 文本已加密。

0 = SQL 文本未加密。

text

nvarchar(max)

SQL 查询的文本。

对于已加密对象为 NULL。

权限

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

注释

对于批处理,SQL 句柄是基于 SQL 文本的哈希值。对于诸如存储过程、触发器或函数之类的数据库对象,SQL 句柄派生自数据库 ID、对象 ID 和对象编号。plan_handle 是派生自整个批处理的已编译计划的一个哈希值。

示例

A. 获取有关按平均 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;

B. 提供批处理执行统计信息

以下示例返回按批执行的 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;