Sql-Server

是否可以確定目前正在執行的儲存過程的哪一部分?

  • June 13, 2017

假設我有一個這樣的儲存過程(假設表模式很好):

CREATE PROCEDURE p_MyProc
AS

INSERT MyTable SELECT Col1 FROM Table1

INSERT MyTable SELECT Col2 FROM Table2

INSERT MyTable SELECT Col3 FROM Table3

假設這些最終是每個可能需要幾分鐘的大插入,是否可以確定哪個目前正在從儲存過程的上下文中執行?

我知道如何找到正在執行的儲存過程,我只是想看看是否有一種方法可以獲得更精細的資訊,而無需在其中添加 PRINT 或其他跟踪語句。有沒有辦法讓語句顯示在跟踪中?

您可以跟隨SQL Server 跟踪擴展事件

您可以查看已完成的語句和/或批次,這應該可以為您提供所需的粒度。

SP:StmtCompleted 事件類

正如您在下面的腳本中看到的那樣,我通過 DMV 完成了這項工作:

(它是更詳細腳本的一部分,但我只是在這個問題中提取了與您相關的部分)

SELECT
----------------------------------------------------------------
-- get the query         - what command we are running inside the stored procedure 
-- and the parent query  - the the stored procedure 
-----------------------------------------------------------------
SUBSTRING (st.text 
               , (CASE WHEN er.statement_start_offset > DATALENGTH(st.text) 
                   THEN 0 ELSE er.statement_start_offset/2 END)+1
               , (CASE WHEN er.statement_end_offset <= 0 THEN DATALENGTH(st.text)
                   ELSE er.statement_end_offset 
                   END - CASE WHEN er.statement_start_offset > DATALENGTH(st.text) 
                       THEN 0 ELSE er.statement_start_offset/2 END)
                   + 1
               ) AS QUERY
   , st.text AS PARENT_QUERY
FROM sys.dm_exec_sessions es
   LEFT OUTER JOIN sys.dm_exec_connections ec ON es.session_id = ec.session_id
   LEFT OUTER JOIN sys.dm_exec_requests er ON es.session_id = er.session_id
   LEFT OUTER JOIN sys.server_principals sp ON es.security_id = sp.sid
   LEFT OUTER JOIN sys.dm_os_tasks ota ON es.session_id = ota.session_id
   LEFT OUTER JOIN sys.dm_os_threads oth ON ota.worker_address = oth.worker_address
   CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) AS st

您可以在下面的範例中看到,它正在執行insert儲存過程內部。

在此處輸入圖像描述

引用自:https://dba.stackexchange.com/questions/27545