共用方式為


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_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)
使用 APPLYsys.dm_exec_text_query_plan (Transact-SQL)