Sql-Server
是否可以確定目前正在執行的儲存過程的哪一部分?
假設我有一個這樣的儲存過程(假設表模式很好):
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 跟踪或擴展事件。
您可以查看已完成的語句和/或批次,這應該可以為您提供所需的粒度。
正如您在下面的腳本中看到的那樣,我通過 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
儲存過程內部。