有可能找出是谁调用了存储过程吗?
例如,假设我在proc3
中遇到错误。在该进程中,我想知道它是由proc1
还是proc2
调用的。
发布于 2008-09-29 09:06:29
如果这对您的逻辑很重要,我将使用额外的输入参数来指定源。
这也将使将您的数据库移植到另一个平台变得更容易,因为您不需要依赖于某些与平台相关的模糊函数。
发布于 2008-09-29 09:15:42
您是否需要在运行时在proc3中知道是谁导致了错误,还是只需要在调试时就知道?
如果您只需要在调试/监视期间使用SQL Server profiler,则可以使用它。
否则,在2005年,我不相信你有能力堆叠跟踪。
要解决这个问题,你可以添加额外的参数到proc3,@CallingProc或类似的东西。
或者,您可以向proc1和proc2添加try catch块。
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 Server2008确实能够通过过程进行调试。
发布于 2008-09-29 11:10:00
没有一种很好的自动方法可以做到这一点(可惜)。因此,这真的取决于你准备(重写)多少你的proc,以便能够做到这一点。
如果您有日志记录机制,则可以读取日志并找出是谁呼叫了您。
例如,如果您通过插入到表中来实现日志记录,例如:
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 )
这对递归调用不起作用,但也许有人可以解决这个问题?
https://stackoverflow.com/questions/148004
复制相似问题