sys.dm_exec_sql_text (Transact-SQL)
適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體
傳回指定 之sql_handle 所識別之 SQL 批次的文字。 這個資料表值函式會取代系統函 式 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:
傳回的資料表
資料行名稱 | 資料類型 | 描述 |
---|---|---|
dbid | smallint | 資料庫的識別碼。 對於預存程式中的靜態 SQL,包含預存程式的資料庫識別碼。 否則,為 Null。 |
objectid | int | 物件的識別碼。 這是臨機操作和備妥 SQL 語句的 Null。 |
number | smallint | 對於編號的預存程式,此資料行會傳回預存程式的數目。 如需詳細資訊,請參閱 sys.numbered_procedures (Transact-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 控制碼衍生自資料庫識別碼、物件識別碼和物件編號。
計畫控制碼是衍生自整個批次已編譯計畫的雜湊值。
注意
無法從 特定查詢sql_handle 判斷 dbid 。 若要判斷 特定查詢的 dbid ,請改用 plan_handle 。
範例
A. 概念範例
以下是說明直接或使用 CROSS APPLY 傳遞 sql_handle 的基本範例。
建立活動。
在 SQL Server Management Studio 的新查詢視窗中執行下列 T-SQL。-- Identify current spid (session_id) SELECT @@SPID; GO -- Create activity WAITFOR DELAY '00:02:00';
使用 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
直接 傳遞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 時間取得前五個查詢的相關資訊
下列範例會傳回前五個查詢的 SQL 語句文字和平均 CPU 時間。
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)
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應