首页 > 解决方案 > 确定proc B的调用者是否是proc A

问题描述

有什么方法可以知道,每次程序 B 运行时,如果它是由程序 A 调用的?

我不想使用 context_info,因为它可能会被调用堆栈中的其他 proc 使用,并且我想避免 SESSION_CONTEXT (尽管它似乎是更好的解决方案),因为我的许多客户的版本都 <2016。

标签: sql-servertsqlsessionstored-procedures

解决方案


……

create or alter procedure procA
as
begin
    declare @hdoc int, @doc char(1);  
    --xml doc
    EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc;

    exec procB
    
    --remove xml doc
    exec sp_xml_removedocument @hdoc;   
end
go

create or alter procedure procB
as
begin
    declare @hdoc int, @doc char(1);  
    --xml doc
    EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc;

    exec procC
    
    --remove xml doc
    exec sp_xml_removedocument @hdoc;   
end
go

create or alter procedure procC
as
begin
    select object_name(@@procid) as whoami, object_name(t.objectid) as whoiscalling, s.creation_time as at
    from sys.dm_exec_xml_handles(@@spid) as s
    cross apply sys.dm_exec_sql_text(s.sql_handle) as t;
end
go

exec procA
go

exec procB
go


drop procedure procA
go
drop procedure procB
go
drop procedure procC
go

推荐阅读