Skip to main content
sys.dm_exec_sql_text (Transact-SQL)
 

ПРИМЕНЯЕТСЯ К: даSQL Server (начиная с 2008) даБаза данных SQL Azure нетХранилище данных SQL Azure нетParallel Data Warehouse

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

  
sys.dm_exec_sql_text(sql_handle | plan_handle)  

sql_handle
Дескриптор SQL искомого пакета. sql_handlevarbinary(64). sql_handle можно получить из следующих объектов DMO:

plan_handle
Идентификатор плана запроса.

Дополнительные сведения см. в разделе sys.dm_exec_text_query_plan (Transact-SQL).

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

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

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

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

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

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

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

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

A. Пример

Ниже приведен простой пример, чтобы проиллюстрировать передачи sql_handle напрямую или с CROSS APPLY.

  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