我希望能夠添加一些日誌記錄到一個特定的存儲過程,由20個數據庫中約5000個存儲過程交叉調用。如何識別調用存儲過程
我想什麼來被添加到的所謂的存儲過程像上面:
INSERT INTO callLog值(@@來電顯示,GETDATE())
所以一段時間後,我可以得到所有正在調用這個的存儲過程的好列表。
任何人都可以幫助我@@ caller部分?
我希望能夠添加一些日誌記錄到一個特定的存儲過程,由20個數據庫中約5000個存儲過程交叉調用。如何識別調用存儲過程
我想什麼來被添加到的所謂的存儲過程像上面:
INSERT INTO callLog值(@@來電顯示,GETDATE())
所以一段時間後,我可以得到所有正在調用這個的存儲過程的好列表。
任何人都可以幫助我@@ caller部分?
嘗試
SELECT @caller = OBJECT_NAME(@@PROCID)
編輯: 後你有電流PROC。名稱,將它傳遞給日誌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
你可能確定原始使用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
遺憾的是,沒有辦法從T-SQL訪問SP調用堆棧。 如果您爲了調試目的而暫時需要它,可以使用SQL Profiler。
This article描述了一種解決方法 - 基本上,使用SET CONTEXT_INFO實現您自己的調用堆棧。
但是,如果您只需要一個過程就可以了,但添加額外參數似乎更方便。
嗯,我認爲這很接近,但除非我失去了一些東西,沒有雪茄。 SELECT @caller = OBJECT_NAME(@@ PROCID) 返回當前存儲過程的名稱,我正在查找調用該存儲過程的proc。 所以 創建PROC A 作爲 EXEC b 去 創建PROC B 作爲 選擇@@呼叫者 去 EXEC一個>返回 'B' – Steven 2010-08-18 06:50:58
史蒂芬,我已經編輯我的答案。正如我寫的,在你獲得當前進程之後。名稱,將它傳遞給日誌sp作爲參數,就是這樣。 下面是一個記錄存儲過程的例子。 http://weblogs.sqlteam.com/brettk/archive/2006/09/21/12391.aspx – hgulyan 2010-08-18 06:54:07
再次感謝。我試圖跟蹤呼叫到一個特定的sp不知道誰是來電者,但這似乎不可能做:( – Steven 2010-08-18 22:31:30