我正在寻找一种方法来识别存储过程的特定实例是否正在运行。
例如,假设我有一个程序,foo,已知可以运行一段很长的时间。我将foo作为进程A的一部分启动,稍后稍后启动一个单独的foo实例作为进程B的一部分。(该进程可以是启动该存储过程的任何外部事件。)
稍后,我希望能够看到foo是否正在运行,但我想具体看看在进程A下启动的foo实例是否仍在运行。
我见过很多解决方案,用于检查sproc的任何实例是否正在运行,但是没有看到任何关于特定实例的内容。
这是我在魔法伪造代码中所希望的:
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帖子类似于我所问的Check if stored procedure is running
但是,除非我弄错了,否则该解决方案会告诉您sproc正在运行,但它并没有告诉我正在运行的sproc实例是否是在特定上下文中执行的实例。
使用他们的解决方案让我们说如果我从一个上下文(A)开始一个sproc,然后从另一个上下文(B)再次启动sproc。一段时间之后,让我们说这两个实例中只有一个仍在运行。如果我按照其他帖子中的示例,它会告诉我sproc当前确实正在运行,但它不会告诉我它是来自上下文A的sproc还是来自上下文B的sproc。
我可能会弄错,但我想每次sql server执行一个sproc时它会为每个实例提供某种句柄ID。我想知道是否有一种方法可以识别sproc正在运行的句柄,并将该句柄存储在某个表格中供参考。
如果我还不清楚,我可以再试一次。
答案 0 :(得分:0)
我真的不知道如何获得程序处理,但是解决方法是编写自己的控件。
如果您有一个表来存储过程信息,请说“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