簡體   English   中英

SQL Server存儲過程可以確定其父proc的名稱嗎?

[英]Can a SQL Server stored proc determine its parent proc's name?

如果Proc A執行Proc B,是否有一種方法讓Proc B查詢它是由A調用而不是有一個參數,其中A傳遞B其ID?

每個請求:我對此感興趣的原因是多方面的1)一般知識,我敢肯定,如果可以做到這將涉及巧妙地使用一些系統表/變量,可以幫助我做其他事情在路上。

2)正如其他人所提到的,記錄/審核。 我想創建一個記錄不需要參數的開始,結束和消息條目的過程,並接受用戶指定消息的一個可選參數。 這將允許人們簡單地將一個exec放在一個proc的頂部和底部以使其工作,審計程序將自己找出其余部分。

我知道這些信息可以在日志文件中找到,但解析這些信息並將它們提供給用戶並不是那么簡單,而這樣可以輕松訪問該基本信息。

3)與信號量一起使用這樣的通用過程可以確保不管會話/事務等如何不同時執行相關過程。

使用像這樣的參數:

CREATE PROCEDURE ParentProcedure

AS

DECLARE @ProcID             int

SET @ProcID=@@PROCID

EXEC ChildProcedure @ProcID

RETURN 0
go

和這個...

CREATE PROCEDURE ChildProcedure
(
@ProcID   int=null --optional
)
AS

if @ProcID IS NOT NULL
BEGIN
    PRINT 'called by '+OBJECT_NAME(@ProcID)
END

RETURN 0
go

不,它無法說出什么是sproc所謂的。 您需要添加一個額外的參數來告訴它調用者是誰

你為什么想這么做?
AFAIK,proc B無法知道誰叫它。

編輯:由於KM顯示它是可能的(根據代碼),我有興趣了解這背后的原因。 您可以將其添加到您的問題中嗎?

如果存儲過程需要根據誰調用它而表現不同,那么它需要添加一個參數。 這樣,如果你添加存儲過程“Z”,代碼仍然可以工作 - “Z”可以通過“C”傳遞它的方式或“D”傳遞它的方式傳遞參數。 如果這還不夠好,則需要在“B”中添加新邏輯。

在MSSQL Server 2008中,您可以使用sys.dm_exec_procedures_stats,這個動態管理視圖可以顯示您何時執行存儲過程(另請參閱sys.procedures以獲取過程的名稱)等等。

SELECT s.*, d.*
FROM sys.procedures s
INNER JOIN sys.dm_exec_procedure_stats d
ON s.object_id = d.object_id
ORDER BY [d.last_execution_time] DESC;

父程序將在此結果集中非常接近地顯示,因為此過程將更早執行。 當然,這不是您問題的完整解決方案,但您可能會獲得一些信息。

是的,如果有並發性,這個解決方案不起作用。 它只能幫助開發或調試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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