20

是否可以找出谁调用了存储过程?

例如,假设我在proc3. 从该过程中,我想知道它是否由proc1or调用proc2

4

4 回答 4

11

如果这对您的逻辑很重要,我会使用额外的输入参数来指定源。

这也将使您的数据库更容易移植到另一个平台,因为您不依赖于一些晦涩的平台相关函数。

于 2008-09-29T09:06:28.550 回答
3

您是否需要在运行时在 proc3 中知道导致错误的原因,还是只需要在调试时知道?

如果您只需要在调试/监视期间执行此操作,则可以使用SQL Server 分析器。

否则在 2005 年我不相信您有能力进行堆栈跟踪。

要解决它,您可以向 proc3、@CallingProc 或类似的东西添加额外的参数。

或者您可以将 try 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 确实具有通过过程进行调试的能力。

于 2008-09-29T09:15:41.540 回答
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 ) 

这不适用于递归调用,但也许有人可以解决这个问题?

于 2008-09-29T11:09:59.877 回答
2

您可以让 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
于 2008-09-29T09:16:14.360 回答