是否有可能找出谁被称为存储过程?
例如,假设我得到一个错误proc3
。 从PROC内我想知道,如果它被称为proc1
或proc2
。
是否有可能找出谁被称为存储过程?
例如,假设我得到一个错误proc3
。 从PROC内我想知道,如果它被称为proc1
或proc2
。
我会用一个额外的输入参数,指定源,如果这是你的逻辑很重要。
这也将你的数据库更容易移植到另一个平台,因为你不依赖于一些不起眼的平台相关的功能。
你需要在运行时引起错误,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中确实有通过但程序调试的能力。
有没有很好的自动方式做到这一点(唉)。 所以这真的取决于你有多少准备(重新)写在特效为了能够做到这一点。
如果你有一个日志机制,您可能能够读取日志,并制定出谁给你打电话。
例如,如果您通过插入到表,例如实现日志记录:
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 )
这不会对递归调用工作,但也许有人能解决这个问题?
你可以有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