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

时间:2016-06-07 02:58:29

标签: sql sql-server sql-server-2008 tsql stored-procedures

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

例如,假设我有一个程序,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正在运行的句柄,并将该句柄存储在某个表格中供参考。

如果我还不清楚,我可以再试一次。

1 个答案:

答案 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