共用方式為


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 (Transact-SQL)>。

傳回的資料表

資料行名稱

資料類型

描述

dbid

smallint

資料庫的識別碼。

特定和準備 SQL 陳述式的這個值是 NULL。

objectid

int

物件的識別碼。

特定和準備 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 控制代碼是從資料庫識別碼、物件識別碼和物件編碼衍生而來。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;