找出在SQL Server中调用存储过程(Find out the calling stored p

2019-07-19 16:38发布

是否有可能找出谁被称为存储过程?

例如,假设我得到一个错误proc3 。 从PROC内我想知道,如果它被称为proc1proc2

Answer 1:

我会用一个额外的输入参数,指定源,如果这是你的逻辑很重要。

这也将你的数据库更容易移植到另一个平台,因为你不依赖于一些不起眼的平台相关的功能。



Answer 2:

你需要在运行时引起错误,PROC3知道或你只需要知道在调试?

您可以使用SQL Server事件探查器 ,如果你只需要调试/监视过程中做到这一点。

否则,在2005年,我不相信你有堆栈跟踪能力。

要解决它,你可以添加和额外的参数PROC3,@CallingProc或类似的东西。

或者你可以加试catch块来PROC1和PROC2。

BEGIN TRY
EXEC Proc3
END TRY
BEGIN CATCH
SELECT 'Error Caught'
SELECT
    ERROR_PROCEDURE()
END CATCH

在这里很好的参考: http://searchsqlserver.techtarget.com/tip/1,289483,sid87_gci1189087,00.html

当然总是SQL Server联机丛书

SQL Server 2008中确实有通过但程序调试的能力。



Answer 3:

有没有很好的自动方式做到这一点(唉)。 所以这真的取决于你有多少准备(重新)写在特效为了能够做到这一点。

如果你有一个日志机制,您可能能够读取日志,并制定出谁给你打电话。

例如,如果您通过插入到表,例如实现日志记录:

CREATE TABLE Log
(timestamp dattime, 
spid       int, 
procname   varchar(255), 
message    varchar(255) )

... text of proc ... 
INSERT INTO Log
SELECT get_date(), @@spid, @currentproc, 'doing something' 
-- you have to define @currentproc in each proc

-- get name of caller
SELECT @caller = procname 
FROM   Log
WHERE  spid = @@spid 
AND    timestamp = (SELECT max(timestamp) 
                    FROM   Log 
                    WHERE  timestamp < get_date() 
                    AND    procname != @currentproc ) 

这不会对递归调用工作,但也许有人能解决这个问题?



Answer 4:

你可以有PROC1和PROC2通过他们的名字PROC3作为参数。

例如:

CREATE PROCEDURE proc3
  @Caller nvarchar(128) -- Name of calling proc.
  AS
  BEGIN
    -- Produce error message that includes caller's name.
    RAISERROR ('Caller was %s.', 16,10, @Caller);
  END
  GO

  CREATE PROCEDURE proc1
  AS
  BEGIN
    -- Get the name of this proc.
    DECLARE @ProcName nvarchar(128);
    SET @ProcName = OBJECT_NAME(@@PROCID);
    -- Pass it to proc3.
    EXEC proc3 @ProcName
  END
  GO

  CREATE PROCEDURE proc2
  AS
  BEGIN
    -- Get the name of this proc.
    DECLARE @ProcName nvarchar(128);
    SET @ProcName = OBJECT_NAME(@@PROCID);
    -- Pass it to proc3.
    EXEC proc3 @ProcName
  END
  GO


文章来源: Find out the calling stored procedure in SQL Server