我希望在一个特定的存储过程中添加一些记录,这个过程由20个数据库中的大约5000个存储过程调用。
我想要的是添加到被调用的存储过程的顶部,例如:
插入callLog值(@@ caller,getdate())
所以过了一会儿,我可以得到一个很好的列表,列出所有正在调用这个的存储过程。
@@ caller部分可以帮助我吗?
答案 0 :(得分:0)
尝试
SELECT @caller = OBJECT_NAME(@@PROCID)
修改强> 你得到当前的proc。 name,传递给log sp作为参数,就是它。
这仅适用于存储过程。
使用此
的示例USE AdventureWorks;
GO
IF OBJECT_ID ( 'usp_FindName', 'P' ) IS NOT NULL
DROP PROCEDURE usp_FindName;
GO
CREATE PROCEDURE usp_FindName
@lastname varchar(40) = '%',
@firstname varchar(20) = '%'
AS
DECLARE @Count int;
DECLARE @ProcName nvarchar(128);
SELECT LastName, FirstName, Phone, EmailAddress
FROM Person.Contact
WHERE FirstName LIKE @firstname AND LastName LIKE @lastname;
SET @Count = @@ROWCOUNT;
SET @ProcName = OBJECT_NAME(@@PROCID);
RAISERROR ('Stored procedure %s returned %d rows.', 16,10, @ProcName, @Count);
GO
EXECUTE dbo.usp_FindName 'P%', 'A%';
更多关于此
http://msdn.microsoft.com/en-us/library/ms174408(SQL.90).aspx
存储过程日志记录的示例。可以有用
http://weblogs.sqlteam.com/brettk/archive/2006/09/21/12391.aspx
这是一个相关的问题
Can a MS/Transact-SQL stored procedure look up its own name?
编辑2:以及SO中的其他相关问题
答案 1 :(得分:0)
您可以使用DBCC INPUTBUFFER识别进入服务器的原始请求,但我认为没有任何东西可以让您找到proc的直接调用者。
(快速编写示例 - 此处可能存在各种权限问题,可能希望将日志记录部分移动到具有不同EXECUTE AS设置的其他存储过程中):
create table CallLog (
EventType varchar(50) not null,
Parameters int not null,
EventInfo varchar(max) not null
)
go
create procedure Callee
as
declare @Logger varchar(1000)
set @Logger = 'dbcc inputbuffer(' + CONVERT(varchar(10),@@SPID) + ')'
insert into CallLog(EventType,Parameters,EventInfo)
exec(@Logger)
--Now do the actual work for the stored proc
select * from sysobjects
go
create procedure Caller
as
exec Callee
go
exec Caller
go
select * from CallLog
答案 2 :(得分:0)
不幸的是,没有办法从T-SQL访问SP调用堆栈。 如果您需要临时进行调试,可以使用SQL事件探查器。
This article描述了一种解决方法 - 基本上,使用SET CONTEXT_INFO实现您自己的调用堆栈 但是,如果您只需要一个程序,那么添加额外的参数似乎更方便。