以下是存储的ProcA的定义:
CREATE PROCEDURE [ProcA]
AS
BEGIN
EXEC ProcABC
INSERT INTO LoggingTable( Object_Name, LastCallDatetime )
SELECT 'ProcABC', GETDATE();
END
在执行存储的Proc ProcA后,执行插入操作(用于记录)时,我需要动态地标识最后一个被调用的存储过程名称,而不是将其硬编码为“ ProcABC”
致谢
答案 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执行任务,