获取当前正在执行的存储过程的句柄



我正在寻找一种方法来识别存储过程的特定实例是否正在运行。

例如,假设我有一个过程foo,它会运行很长一段时间。我将foo作为进程a的一部分启动,稍后将foo的一个单独实例作为进程B的一部分。(该进程可以是启动该存储过程的任何外部事物。)

稍后,我希望能够查看foo是否正在运行,但我希望具体查看在进程A下启动的foo实例是否仍在运行。

我已经看到了许多用于检查存储过程的任何实例是否正在运行的解决方案,但还没有看到任何关于特定实例的解决方案。

以下是我在魔术伪造代码中所希望的东西:

CREATE PROCEDURE foo
AS
BEGIN
INSERT INTO fooWorkLog (handle)
VALUES (@@MagicValueTellingMeTheSpecificHandleOfThisInstanceOfTheSproc)
-- do other stuff
END
-- One Process does this
EXEC foo --let's say we know this has handle 123
-- Meanwhile another process does this
EXEC foo --let's say we know this has handle 789
-- A little bit later, from a different process
DECLARE @TheHandleImLookingFor INT = 123
SELECT ActiveHandle FROM SqlServersListOfActiveHandles
WHERE ActiveHandle = @TheHandleImLookingFor

有什么想法吗?

更多信息

下面的SO帖子类似于我所问的检查存储过程是否正在运行

但是,除非我错了,否则该解决方案会告诉您存储过程正在运行,但不会告诉我正在运行的存储过程实例是否是在特定上下文中执行的实例。

使用他们的解决方案,假设我从一个上下文(a)启动存储过程,然后从另一个上下文再次启动存储过程(B)。一段时间后,假设这两个实例中只有一个仍在运行。如果我遵循另一篇文章中的示例,它会告诉我存储过程当前确实在运行,但不会告诉我它是来自上下文A的存储过程还是来自上下文B的存储过程。

我可能错了,但我认为每次sql server执行存储过程时,它都会为每个实例提供某种句柄id。我想知道是否有一种方法可以识别存储过程运行的句柄,并将该句柄存储在某个表中以供参考。

如果我还不清楚,我可以再举一个例子。

我真的不知道如何获得过程句柄,但解决方法是编写自己的控件。

如果您有一个表来存储过程信息,比如"tb_ProcedureControl",您可以在过程开始时插入一条记录,然后在过程结束时设置结束日期。

例如:

CREATE PROCEDURE MyProc
@param1...
,@param2...
,@InstanceInfo = NULL --Optional parameter
AS
BEGIN
--create the record for the instance
INSERT INTO tb_ProcedureControl (InstanceInfo, Start, End) VALUES (@InstanceInfo, getdate(), null)   

<TASK TO DO>
--set the end of the process
UPDATE tb_ProcedureControl SET End = GETDATE()
WHERE InstanceInfo = @InstanceInfo
END

最新更新