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_handleVarbinary (64)

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

plan_handle
這是可唯一識別已執行且其計畫位於計畫快取中,或目前正在執行的批次查詢執行計畫的權杖。 plan_handleVarbinary (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 控制碼是以提交至伺服器的 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)