sys.dm_exec_sql_text (Transact-SQL)

Применимо к: даSQL Server (все поддерживаемые версии) ДаБаза данных SQL Azure

возвращает текст SQL пакета, идентифицируемого указанным sql_handle. Функция с табличным значением заменяет системную функцию fn_get_sql.

Синтаксис

sys.dm_exec_sql_text(sql_handle | plan_handle)  

Аргументы

sql_handle
Токен, однозначно определяющий пакет, который был выполнен или в данный момент выполняется. sql_handle имеет тип varbinary (64).

Sql_handle можно получить из следующих объектов DMO:

plan_handle
Токен, однозначно определяющий план выполнения запроса для пакета, который был выполнен, а его план находится в кэше планов или в данный момент выполняется. plan_handle имеет тип varbinary (64).

Plan_handle можно получить из следующих объектов DMO:

Возвращаемая таблица

Имя столбца Тип данных Описание
DBID smallint Идентификатор базы данных.

Для нерегламентированных и подготовленных инструкций SQL это идентификатор базы данных, в которой происходила компиляция инструкции.
objectid int Идентификатор объекта.

Имеет значение NULL для нерегламентированных и подготовленных инструкций SQL.
number smallint Для пронумерованной хранимой процедуры этот столбец возвращает ее номер. дополнительные сведения см. в разделе sys.numbered_procedures (Transact-SQL).

Имеет значение NULL для нерегламентированных и подготовленных инструкций SQL.
Шифрование bit 1 = текст SQL зашифрован.

0 = текст SQL не зашифрован.
text nvarchar (Max ) Текст SQL-запроса.

Имеет значение NULL для зашифрованных объектов.

Разрешения

Необходимо разрешение VIEW SERVER STATE на сервере.

Remarks

для нерегламентированных запросов дескрипторы SQL являются хэш-значениями на основе SQL текста, отправляемого на сервер, и могут исходить из любой базы данных.

Для таких объектов баз данных, как хранимые процедуры, триггеры или функции, дескрипторы SQL создаются на основе идентификатора базы данных, идентификатора объекта, а также номера объекта.

Handle Plan — это хэш-значение, полученное из скомпилированного плана всего пакета.

Примечание

невозможно определить DBID из sql_handle для нерегламентированных запросов. Чтобы определить DBID для нерегламентированных запросов, используйте вместо этого plan_handle .

Примеры

A. Концептуальный пример

Ниже приведен простой пример, иллюстрирующий передачу sql_handle либо напрямую, либо с ПЕРЕкрестным применением.

  1. Создать действие.
    выполните следующую инструкцию T-SQL в новом окне запроса в SQL Server Management Studio .

    -- Identify current spid (session_id)
    SELECT @@SPID;
    GO
    
    -- Create activity
      WAITFOR DELAY '00:02:00';
    
  2. Использование CROSS APPLY.
    Sql_handle из sys.dm_exec_requests будут переданы sys.dm_exec_sql_text с помощью CROSS APPLY. Откройте новое окно запроса и передайте SPID, определенный на шаге 1. В этом примере 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 напрямую.
    Получите sql_handle от sys.dm_exec_requests. Затем передайте sql_handle непосредственно в sys.dm_exec_sql_text. Откройте новое окно запроса и передайте SPID, определенный на шаге 1, в 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
    

Б. Получение сведений о пяти первых запросах по среднему времени ЦП

Следующий пример возвращает текст инструкции 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;  

В. Предоставление статистики пакетного выполнения

Следующий пример возвращает текст запросов 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)