簡體   English   中英

在 SQL Server 中找出調用存儲過程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM