首先請確保您的數據庫兼容模式設置為 90,以下語句才會成功!

SELECT TOP 1000 QS.creation_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, ST.text, QS.total_worker_time, QS.last_worker_time, QS.max_worker_time, QS.min_worker_time FROM sys.dm_exec_query_stats QS --關鍵字 CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) ST WHERE QS.creation_time BETWEEN '2020-11-10 00:00:00' AND '2020-11-17 00:00:00' -- AND ST.text NOT LIKE '%SELECT * FROM T_LOCATIONINFO WHERE STRCLIPLOGICID in(%' AND ST.text LIKE '%Txj_web_user_record%' ORDER BY QS.creation_time DESC
官方文檔:
https://docs.microsoft.com/zh-cn/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-sql-text-transact-sql?view=sql-server-2017
sys.dm_exec_sql_text (Transact-SQL)
適用於: SQL Server(所有支持的版本)
Azure 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 | 數據庫的 ID。 對於臨時和預定義 SQL 語句,指編譯這些語句時所在的數據庫的 ID。 |
objectid | int | 對象的 ID。 對於臨時和預定義 SQL 語句為 NULL。 |
數字 | smallint | 對於帶編號的存儲過程,此列返回存儲過程的編號。 有關詳細信息,請參閱 (transact-sql)sys.numbered_procedures 。 對於臨時和預定義 SQL 語句為 NULL。 |
過 | bit | 1 = SQL 文本已加密。 0 = SQL 文本未加密。 |
text | nvarchar (max ) | SQL 查詢的文本。 對於已加密對象為 NULL。 |
權限
要求具有對服務器的 VIEW SERVER STATE
權限。
備注
對於即席查詢,SQL 句柄是基於提交給服務器的 SQL 文本的哈希值,並且可以來自任何數據庫。
對於諸如存儲過程、觸發器或函數之類的數據庫對象,SQL 句柄派生自數據庫 ID、對象 ID 和對象編號。
計划句柄是派生自整個批處理的已編譯計划的一個哈希值。
備注
無法根據即席查詢 sql_handle 確定 dbid 。 若要確定適用於即席查詢的 dbid ,請改用 plan_handle 。
示例
A. 概念示例
下面是一個基本示例,演示如何直接或通過 交叉應用 傳遞 sql_handle 。
-
創建活動。
在的新查詢窗口中執行以下 T-sql SQL Server Management Studio 。SQL-- Identify current spid (session_id) SELECT @@SPID; GO -- Create activity WAITFOR DELAY '00:02:00';
-
使用 交叉應用。
將使用 跨應用 將 sys.dm_exec_requests 中的 sql_handle 傳遞給 sys.dm_exec_sql_text 。 打開一個新的查詢窗口,並傳遞步驟1中標識的 spid。 在此示例中,spid 的行為是59
。SQLSELECT 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。SQL-- 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)
建議的內容
-
sys.dm_exec_query_stats (Transact-sql) - SQL Server
sys.dm_exec_query_stats (Transact-SQL)
-
sys.dm_db_index_usage_stats (Transact-sql) - SQL Server
sys.dm_db_index_usage_stats (Transact-SQL)
-
sys.dm_tran_active_transactions (Transact-sql) - SQL Server
sys.dm_tran_active_transactions (Transact-SQL)
-
sys.dm_os_waiting_tasks (Transact-sql) - SQL Server
sys.dm_os_waiting_tasks (Transact-SQL)