2016-06-07 53 views
0

我正在寻找一种方法来识别存储过程的特定实例是否正在运行。获取当前正在执行的存储过程的句柄

例如,假设我有一个程序foo,它已知可以运行很长一段时间。我开始将foo作为进程A的一部分,稍后稍后启动另一个foo实例作为进程B的一部分。(该进程可能是启动该存储过程的任何外部事件。)

稍后,我想要能够看到foo是否正在运行,但我想特别看看在进程A下启动的foo实例是否仍在运行。

我见过很多解决方案来检查存储过程的任何实例是否正在运行,但是没有看到有关特定实例的任何信息。

这里的kindof是我在魔术fakey代码希望:

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的实例是否是在特定上下文中执行的实例。

使用他们的解决方案让我们说,如果我从一个上下文(A)开始一个sproc,然后从另一个上下文(B)再次启动sproc。一段时间后,让我们说,这两个实例中只有一个仍在运行。如果我按照另一篇文章的例子,它会告诉我,该sproc确实正在运行,但它不会告诉我它是上下文A中的sproc还是上下文B中的sproc。

我可能会误认为,但我想每次SQL服务器执行一个存储过程,它给每个实例一个处理ID。我想知道是否有一种方法可以识别sproc正在运行的句柄,并将该句柄存储在某个表中供参考。

如果我还没有清楚,我可以再试一遍另一个例子。

+0

你可以使用新的GUID(),它是独一无二的,当插入并给予2个工序之间明确分工 – Ajay2707

+0

提供一些更多的细节问题尚不清楚。 –

+0

@sandeeprawat我已经添加了一些更多的解释,但可能还不清楚。让我知道你是否想要一个更好的例子。 – Joe

回答

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 
相关问题