このようなストアドプロシージャがあるとします(テーブルスキーマに問題がないと仮定します)。
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
を実行しています。