[英]Find out the calling stored procedure in SQL Server
是否可以找出誰調用了存儲過程?
例如,假設我在proc3
中遇到錯誤。 在該過程中,我想知道它是由proc1
還是proc2
的。
如果這對您的邏輯很重要,我會使用額外的輸入參數來指定源。
這也將使您的數據庫更容易移植到另一個平台,因為您不依賴於一些晦澀的平台相關函數。
沒有很好的自動方法來做到這一點(唉)。 因此,這實際上取決於您准備(重新)編寫您的過程以便能夠做到這一點的程度。
如果您有日志記錄機制,您可能能夠閱讀日志並找出誰給您打電話。
例如,如果您通過插入表來實現日志記錄,例如:
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 )
這不適用於遞歸調用,但也許有人可以解決這個問題?
您是否需要在運行時在 proc3 中知道導致錯誤的原因,還是只需要在調試時知道?
如果您只需要在調試/監視期間執行此操作,則可以使用SQL Server 分析器。
否則在 2005 年我不相信您有能力進行堆棧跟蹤。
要解決它,您可以向 proc3、@CallingProc 或類似的東西添加額外的參數。
或者您可以將 try 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 確實具有通過過程進行調試的能力。
您可以讓 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.