【发布时间】:2016-06-07 02:58:29
【问题描述】:
我正在寻找一种方法来确定存储过程的特定实例是否正在运行。
例如,假设我有一个过程 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 帖子与我要问的类似 Check if stored procedure is running
但是,除非我弄错了,否则该解决方案会告诉您 sproc 正在运行,但它不会告诉我正在运行的 sproc 实例是否是在特定上下文中执行的实例。
使用他们的解决方案,假设我从一个上下文 (A) 启动了一个存储过程,然后从另一个上下文 (B) 再次启动了存储过程。一段时间后,假设这两个实例中只有一个仍在运行。如果我按照另一篇文章中的示例进行操作,它会告诉我 sproc 确实当前正在运行,但它不会告诉我它是来自上下文 A 的 sproc 还是来自上下文 B 的 sproc。
我可能弄错了,但我认为每次 sql server 执行存储过程时,它都会为每个实例提供某种句柄 ID。我想知道是否有一种方法可以识别 sproc 正在运行的句柄并将该句柄存储在某个表中以供参考。
如果我还不清楚,我可以用另一个例子再试一次。
【问题讨论】:
-
您可以使用新的 guid(),它在插入时是独一无二的,并在 2 个进程之间提供了明确的分隔
-
给出更多细节问题不清楚。
-
@sandeeprawat 我已经添加了更多解释,但可能还不清楚。如果你想要一个更好的例子,请告诉我。
标签: sql sql-server sql-server-2008 tsql stored-procedures