在 SQL 服务器中记录嵌套存储过程

Logging of nested stored procedures in SQL Server

如何单独记录父存储过程执行的嵌套存储过程的信息?

示例:

CREATE PROCEDURE dbo.usp_ParentProcedure
AS
BEGIN
    EXEC dbo.usp_ChildProcedure1
    EXEC dbo.usp_ChildProcedure2
    EXEC dbo.usp_ChildProcedure3
END  
GO

理想情况下,我想记录交易时间,I/0,CPU 单独使用每个嵌套存储过程,同时只修改父过程。

原因是嵌套过程经常被其他用户添加到父过程或从父过程中删除,我们都知道让每个人都遵循创建协议是一项非常艰巨的工作。

Aaron Bertrand 在这里分享了他记录单个存储过程的解决方案 http://www.mssqltips.com/sqlservertip/2003/simple-process-to-track-and-log-sql-server-stored-procedure-use/

如果有人可以帮助我扩展它以涵盖我上面的场景,我将不胜感激。

谢谢

尼尔

在花了一些时间查看 dm 表后,我发现 运行 这个查询 after 执行 parent 存储过程 returns 有关子存储过程的一些有用信息。

SELECT
    DB_NAME (s.database_id),
    s.[object_id],
    p.name,
    s.sql_handle,
    s.plan_handle,
    s.last_worker_time,
    s.last_elapsed_time,
    s.last_physical_reads,
    s.last_logical_writes,
    s.last_logical_reads,
    p2.name,
    p2.[object_id]
FROM sys.dm_exec_procedure_stats s
INNER JOIN sys.procedures p
ON s.[object_id] = p.[object_id]
LEFT JOIN sys.procedures p2 --join to identify parent procedure from results
ON p2.[object_id] = (
    select top 1 s.[object_id]
    from sys.dm_exec_procedure_stats s
    inner join sys.procedures p
    ON s.[object_id] = p.[object_id]
    order by s.total_worker_time desc
)
WHERE s.[object_id] <> p2.[object_id]
AND s.[object_id] <> @@PROCID