在父存储过程中标识上次调用的存储过程名称

时间:2019-02-11 12:06:35

标签: sql-server tsql

以下是存储的ProcA的定义:

CREATE PROCEDURE [ProcA]
AS
BEGIN
    EXEC ProcABC
    INSERT INTO LoggingTable(   Object_Name, LastCallDatetime   )
    SELECT                      'ProcABC',      GETDATE();
END

在执行存储的Proc ProcA后,执行插入操作(用于记录)时,我需要动态地标识最后一个被调用的存储过程名称,而不是将其硬编码为“ ProcABC”

致谢

2 个答案:

答案 0 :(得分:2)

您可以使用CONTEXT_INFO会话变量存储最多128个二进制字节。

例如:

--Parent Proc
CREATE OR ALTER PROC Parent
AS
DECLARE @CallingProc SYSNAME
SELECT TOP 1 @CallingProc = name FROM sys.procedures WHERE object_id = @@PROCID

DECLARE @BinVar VARBINARY(128)
SET @BinVar = CONVERT(VARBINARY, @CallingProc, 0)

SET CONTEXT_INFO @BinVar

EXEC Child

GO
--Child Proc
CREATE OR ALTER PROC Child 
AS
DECLARE @CallingProc SYSNAME
DECLARE @BinVar VARBINARY(128)

SET @BinVar = CONTEXT_INFO()

SELECT CONVERT(NVARCHAR, @BinVar, 0)

GO

EXEC Parent -- Will return 'Parent' even though the SELECT occurred in the Child proc

这样,您可以将过程调用堆栈名称从父级传递到子级,直到CONTEXT_INFO变量的限制。要解决此限制,可以使用参考别名表将短名称与完整过程名称进行映射。

希望这会有所帮助

答案 1 :(得分:0)

如下所示创建一个表,并将数据作为parent_proc插入为“ A”,将sp_name插入为“ ABC”,输入参数列表为“ in_param”(@ 1,@ 2,@ 3 ...)

CREATE Table sp_list(parent_proc, sp_name, in_param)

现在使动态SQL执行任务,