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