sys.dm_exec_sql_text (Transact-SQL)
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр 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 можно получить из следующих динамических объектов управления:
plan_handle
Это токен, который уникально идентифицирует план выполнения запросов для выполненного пакета, план которого хранится в кэше планов или пребывает на этапе выполнения. plan_handle — varbinary(64).
plan_handle можно получить из следующих объектов динамического управления:
Возвращаемая таблица
Имя столбца | Тип данных | Description |
---|---|---|
dbid | smallint | Идентификатор базы данных. Для статического SQL в хранимой процедуре идентификатор базы данных, содержащей хранимую процедуру. В противном случае - значение NULL. |
objectid | int | Идентификатор объекта. Имеет значение NULL для нерегламентированных и подготовленных инструкций SQL. |
number | smallint | Для пронумерованной хранимой процедуры этот столбец возвращает ее номер. Дополнительные сведения см. в разделе sys.numbered_procedures (Transact-SQL). Имеет значение NULL для нерегламентированных и подготовленных инструкций SQL. |
encrypted | bit | 1 = текст SQL зашифрован. 0 = текст SQL не зашифрован. |
text | nvarchar(max) | Текст SQL-запроса. Имеет значение NULL для зашифрованных объектов. |
Разрешения
Необходимо разрешение VIEW SERVER STATE
на сервере.
Разрешения для SQL Server 2022 и более поздних версий
Требуется разрешение VIEW SERVER PERFORMANCE STATE на сервере.
Замечания
Для нерегламентированных запросов дескриптор SQL — это хэш-значения на основе текста SQL, отправляемого на сервер, и могут исходить из любой базы данных.
Для таких объектов баз данных, как хранимые процедуры, триггеры или функции, дескрипторы SQL создаются на основе идентификатора базы данных, идентификатора объекта, а также номера объекта.
Дескриптор плана является хэш-значением, производным от скомпилированного плана всего пакета.
Примечание.
dbid нельзя определить из sql_handle для нерегламентированных запросов. Чтобы определить dbid для нерегламентированных запросов, используйте вместо этого plan_handle .
Примеры
А. Концептуальный пример
Ниже приведен базовый пример для иллюстрации передачи sql_handle напрямую или с помощью CROSS APPLY.
Создание действия.
Выполните следующий T-SQL в новом окне запроса в SQL Server Management Studio.-- Identify current spid (session_id) SELECT @@SPID; GO -- Create activity WAITFOR DELAY '00:02:00';
Использование CROSS APPLY.
Sql_handle из sys.dm_exec_requests будут переданы sys.dm_exec_sql_text с помощью CROSS APPLY. Откройте новое окно запроса и передайте spid, определенный на шаге 1. В этом примере выполняется59
spid.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
Передача sql_handle напрямую.
Получите sql_handle из sys.dm_exec_requests. Затем передайте sql_handle непосредственно в sys.dm_exec_sql_text. Откройте новое окно запроса и передайте spid, определенный на шаге 1, в sys.dm_exec_requests. В этом примере выполняется59
spid. Затем передайте возвращенную 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. Получение сведений о пяти первых запросах по среднему времени ЦП
Следующий пример возвращает текст инструкции 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)