sys.dm_exec_sql_text (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

指定した 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 データベースの ID。

ストアド プロシージャ内の静的 SQL の場合、ストアド プロシージャを含むデータベースの ID。 その他の場合は NULL が返されます。
objectid int オブジェクトの ID。

アドホック SQL ステートメントおよび準備された SQL ステートメントの場合は NULL になります。
number smallint 番号付きストアド プロシージャの場合、ストアド プロシージャの番号。 詳細については、「 sys.numbered_procedures (Transact-SQL)」を参照してください。

アドホック 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 ハンドルはデータベース ID、オブジェクト ID、およびオブジェクト番号から派生します。

プラン ハンドルは、バッチ全体のコンパイル済みプランから派生したハッシュ値です。

注意

アドホック クエリのsql_handleから dbid を特定することはできません。 アドホック クエリの dbid を確認するには、代わりに plan_handle を使用します。

A. 概念的な例

次に、sql_handleを直接渡すか、CROSS APPLYを使用して渡す方法を示す基本的な例を示します。

  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 時間で上位 5 つのクエリに関する情報を取得する

次の例では、上位 5 つのクエリにかかった平均 CPU 時間と SQL ステートメントのテキストを返します。

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)