sys.dm_exec_sql_text (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure 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。
encrypted 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)
使用 APPLY sys.dm_exec_text_query_plan (Transact-SQL)