如何识别调用存储过程

时间:2010-08-18 05:51:34

标签: c# sql-server tsql

我希望在一个特定的存储过程中添加一些记录,这个过程由20个数据库中的大约5000个存储过程调用。

我想要的是添加到被调用的存储过程的顶部,例如:

插入callLog值(@@ caller,getdate())

所以过了一会儿,我可以得到一个很好的列表,列出所有正在调用这个的存储过程。

@@ caller部分可以帮助我吗?

3 个答案:

答案 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中的其他相关问题

Find out the calling stored procedure in SQL Server

答案 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实现您自己的调用堆栈 但是,如果您只需要一个程序,那么添加额外的参数似乎更方便。