sys.dm_exec_sql_text (Transact-SQL)

適用于: SQL Server Azure SQL 資料庫Azure SQL 受控執行個體

傳回指定 之sql_handle所識別之 SQL 批次的文字。 這個資料表值函式取代系統函數 fn_get_sql

語法

sys.dm_exec_sql_text(sql_handle | plan_handle)  

引數

sql_handle
這是可唯一識別已執行或目前正在執行的批次的權杖。 sql_handle為 Varbinary (64)

您可以從下列動態管理物件取得 sql_handle

plan_handle
這是一個權杖,可唯一識別已執行的批次查詢執行計畫,且其計畫位於計畫快取中,或目前正在執行中。 plan_handle為 Varbinary (64)

您可以從下列動態管理物件取得 plan_handle

傳回的資料表

資料行名稱 資料類型 描述
dbid smallint 資料庫的識別碼。

針對預存程式中的靜態 SQL,包含預存程式的資料庫識別碼。 否則,為 Null。
objectid int 物件的識別碼。

特定和準備 SQL 陳述式的這個值是 NULL。
number smallint 對於已編號的預存程序,這個資料行會傳回預存程序的編號。 如需詳細資訊,請參閱 sys.numbered_procedures (Transact-SQL)

特定和準備 SQL 陳述式的這個值是 NULL。
加密 bit 1 = SQL 文字已加密。

0 = SQL 文字未加密。
text Nvarchar (max) SQL 查詢的文字。

加密物件的這個值是 NULL。

權限

需要伺服器的 VIEW SERVER STATE 權限。

SQL Server 2022 和更新版本的許可權

需要伺服器上的 VIEW SERVER PERFORMANCE STATE 許可權。

備註

針對臨機操作查詢,SQL 控制碼是根據提交至伺服器的 SQL 文字來雜湊值,而且可能來自任何資料庫。

針對預存程序、觸發程序或函數之類的資料庫物件,SQL 控制代碼是從資料庫識別碼、物件識別碼和物件編碼衍生而來。

計畫控制碼是衍生自整個批次編譯計畫的雜湊值。

注意

無法從特定查詢的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)