如果Proc A执行Proc B,是否有一种方法让Proc B查询它是由A调用而不是有一个参数,其中A传递B其ID?
根据要求:我对此感兴趣的原因是多方面的 1)一般知识,我敢肯定,如果可以做到这将涉及巧妙地使用一些系统表/变量,可以帮助我做其他事情。
2)正如其他人所提到的,记录/审核。我想创建一个记录不需要参数的开始,结束和消息条目的过程,并接受用户指定消息的一个可选参数。这样就可以简单地将一个exec放在proc的顶部和底部以使其工作,审计程序将自己解决其余部分。
我知道这些信息在日志文件中可用,但解析这些信息并将它们提供给用户并不是那么简单,而这样可以轻松访问该基本信息。
3)与信号量结合使用这样的通用过程可以确保不会同时执行相关过程而不管会话/事务等。
答案 0 :(得分:5)
使用像这样的参数:
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
答案 1 :(得分:1)
答案 2 :(得分:0)
你为什么要这样做?
AFAIK,proc B无法知道谁叫它。
编辑:由于KM显示它是可能的(根据代码),我有兴趣了解这背后的原因。你也可以将它添加到你的问题中吗?
答案 3 :(得分:0)
如果存储过程需要根据谁调用它而表现不同,那么它需要添加一个参数。这样,如果你添加存储过程“Z”,代码仍然可以工作 - “Z”可以通过“C”传递它的方式或“D”传递它的方式传递参数。如果这还不够好,则需要在“B”中添加新逻辑。
答案 4 :(得分:0)
在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;
此结果集中将显示父程序非常接近,因为此过程将更早执行。 当然,这不是您问题的完整解决方案,但您可能会获得一些信息。
是的,如果有并发性,这个解决方案不起作用。它只能帮助开发或调试。