web-dev-qa-db-ja.com

ストアドプロシージャのどの部分が現在実行されているかを判別することは可能ですか?

このようなストアドプロシージャがあるとします(テーブルスキーマに問題がないと仮定します)。

CREATE PROCEDURE p_MyProc
AS

INSERT MyTable SELECT Col1 FROM Table1

INSERT MyTable SELECT Col2 FROM Table2

INSERT MyTable SELECT Col3 FROM Table3

これらがそれぞれ数分かかる可能性のある大きな挿入であると仮定すると、ストアドプロシージャのコンテキスト内から、現在実行されている挿入を判別することは可能ですか?

実行中のストアドプロシージャを見つける方法を知っています。PRINTやその他のトレースステートメントを追加せずに、よりきめ細かくする方法があるかどうかを調べています。ステートメントをトレースに表示する方法はありますか?

4
squillman

SQL Serverトレース または 拡張イベント のいずれかに従うことができます。

完了したステートメントやバッチを監視できます。これにより、探している粒度が得られるはずです。

SP:StmtCompletedイベントクラス

3
Thomas Stringer

以下のスクリプトでわかるように、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を実行しています。

enter image description here

0