Sql server SQL Server存储进程能否确定其父进程';她叫什么名字?

Sql server SQL Server存储进程能否确定其父进程';她叫什么名字?,sql-server,tsql,Sql Server,Tsql,如果Proc A执行Proc B,那么Proc B是否有办法查找它是由A调用的,而不是使用A传递B其ID的参数 每个请求:我对此感兴趣的原因是多方面的 1) 一般知识,我相信如果能做到这一点,它将涉及一些系统表/变量的巧妙使用,这可能会帮助我做其他事情 2) 正如其他人提到的,日志记录/审计。我想创建一个过程,记录不需要参数的begin、end和message条目,并接受用户指定消息的一个可选参数。这将允许一个人简单地将一个exec放在proc的顶部和底部以使其工作,而审计过程将自己解决其余的问

如果Proc A执行Proc B,那么Proc B是否有办法查找它是由A调用的,而不是使用A传递B其ID的参数

每个请求:我对此感兴趣的原因是多方面的 1) 一般知识,我相信如果能做到这一点,它将涉及一些系统表/变量的巧妙使用,这可能会帮助我做其他事情

2) 正如其他人提到的,日志记录/审计。我想创建一个过程,记录不需要参数的begin、end和message条目,并接受用户指定消息的一个可选参数。这将允许一个人简单地将一个exec放在proc的顶部和底部以使其工作,而审计过程将自己解决其余的问题

我知道这些信息可以在日志文件中找到,但是解析这些信息并将其提供给用户并不是那么简单,然而,这样可以方便地访问这些基本信息


3) 与信号量结合使用,这样一个通用过程可以确保相关进程不会同时执行,而不管会话/事务等。

为什么要这样做?
抱歉,proc B不可能知道是谁叫的


编辑:由于KM表明这是可能的(根据代码),我有兴趣理解这样做背后的原因。通过将其添加到您的问题中,您是否也可以发布此消息?

如果存储过程需要根据调用它的人的不同而采取不同的行为,那么它需要添加一个参数。这样,如果添加存储过程“Z”,代码仍然可以工作——“Z”可以以“C”或“D”传递参数的方式传递参数。如果这还不够好,那么需要在“B”中添加新的逻辑。

不,它无法说出存储过程将其称为什么。您需要在中添加一个额外的参数来告诉它呼叫者是谁

使用如下参数:

CREATE PROCEDURE ParentProcedure

AS

DECLARE @ProcID             int

SET @ProcID=@@PROCID

EXEC ChildProcedure @ProcID

RETURN 0
go
而这个

CREATE PROCEDURE ChildProcedure
(
@ProcID   int=null --optional
)
AS

if @ProcID IS NOT NULL
BEGIN
    PRINT 'called by '+OBJECT_NAME(@ProcID)
END

RETURN 0
go

在MSSQL Server 2008中,您可以使用sys.dm_exec_procedures_stats,此动态管理视图可以显示存储过程(请参见sys.procedures以获取过程名称)的执行时间等

SELECT s.*, d.*
FROM sys.procedures s
INNER JOIN sys.dm_exec_procedure_stats d
ON s.object_id = d.object_id
ORDER BY [d.last_execution_time] DESC;
父过程将非常接近地显示在此结果集中,因为此过程将更早执行。 当然,这并不能完全解决您的问题,但您可以获得一些信息


是的,如果存在并发性,则此解决方案不起作用。它只能帮助开发或调试。

我以前这样做是为了帮助记录事件。在重要/有问题的过程中,我会在varchar(8000)变量上添加有用的信息,因为该过程会执行各种操作。当出现错误时,我回滚并将该字符串插入到日志表中,其中包含许多有用的信息。有时知道谁调用了这个程序会有帮助,并且可以记录其他信息…我想是的。与存储过程的StackTrace相同。谢谢你,我不想打那么深的电话。我使用了这种技术来跟踪从多个位置调用的过程。知道自己的参数不好是一回事,知道它们来自何处是另一回事SQL中是否有某种方法可以获取正在执行的语句列表(探查器看到的方式)?我不知道,但可以调试到存储过程中。您可能会编写一些非常复杂的代码,这些代码会影响系统视图,通过调用堆栈跟踪和分析。。。但我不知道信息是否存在,也不知道是否值得付出努力。