2010-08-18 107 views
3

我希望能夠添加一些日誌記錄到一個特定的存儲過程,由20個數據庫中約5000個存儲過程交叉調用。如何識別調用存儲過程

我想什麼來被添加到的所謂的存儲過程像上面:

INSERT INTO callLog值(@@來電顯示,GETDATE())

所以一段時間後,我可以得到所有正在調用這個的存儲過程的好列表。

任何人都可以幫助我@@ caller部分?

回答

0

嘗試

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

Find out the calling stored procedure in SQL Server

+0

嗯,我認爲這很接近,但除非我失去了一些東西,沒有雪茄。 SELECT @caller = OBJECT_NAME(@@ PROCID) 返回當前存儲過程的名稱,我正在查找調用該存儲過程的proc。 所以 創建PROC A 作爲 EXEC b 去 創建PROC B 作爲 選擇@@呼叫者 去 EXEC一個>返回 'B' – Steven 2010-08-18 06:50:58

+0

史蒂芬,我已經編輯我的答案。正如我寫的,在你獲得當前進程之後。名稱,將它傳遞給日誌sp作爲參數,就是這樣。 下面是一個記錄存儲過程的例子。 http://weblogs.sqlteam.com/brettk/archive/2006/09/21/12391.aspx – hgulyan 2010-08-18 06:54:07

+0

再次感謝。我試圖跟蹤呼叫到一個特定的sp不知道誰是來電者,但這似乎不可能做:( – Steven 2010-08-18 22:31:30

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 
0

遺憾的是,沒有辦法從T-SQL訪問SP調用堆棧。 如果您爲了調試目的而暫時需要它,可以使用SQL Profiler。

This article描述了一種解決方法 - 基本上,使用SET CONTEXT_INFO實現您自己的調用堆棧。
但是,如果您只需要一個過程就可以了,但添加額外參數似乎更方便。