sys.dm_exec_sql_text (Transact-SQL)

指定された sql_handle が示す SQL バッチのテキストを返します。このテーブル値関数は、システム関数 fn_get_sql に代わるものです。

構文

sys.dm_exec_sql_text(sql_handle | plan_handle)

引数

  • sql_handle
    検索するバッチの SQL ハンドルを指定します。sql_handle のデータ型は varbinary(64) です。sql_handle は、次の動的管理オブジェクトから取得できます。

    • sys.dm_exec_query_stats

    • sys.dm_exec_requests

    • sys.dm_exec_cursors

    • sys.dm_exec_xml_handles

    • sys.dm_exec_query_memory_grants

    • sys.dm_exec_connections

  • plan_handle
    クエリ プランの識別子です。

    詳細については、「sys.dm_exec_text_query_plan (Transact-SQL)」を参照してください。

返されるテーブル

列名

データ型

説明

dbid

smallint

データベースの ID。

アドホック SQL ステートメントおよび準備された SQL ステートメントの場合は 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 ハンドルは SQL テキストに基づくハッシュ値です。ストアド プロシージャ、トリガ、または関数などのデータベース オブジェクトでは、SQL ハンドルはデータベース ID、オブジェクト ID、オブジェクト番号から取得します。plan_handle はバッチ全体のコンパイル済みプランから取得したハッシュ値です。

A. 平均 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;

B. バッチ実行の統計を取得する

次の例では、バッチで実行されている 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;