我必须在存储过程中启动循环过程,然后必须在一段时间后(12-24 小时后)停止它。存储过程的工作不应启动两次。SQL Server 客户端(调用方)不应等待且不应执行超时。如何实施?
CREATE PROC dbo.CyclingProcess
AS
BEGIN
/*
.. how to start or stop process by external caller
*/
WHILE(1 = 1)
BEGIN
EXEC mysp_WorkingProcedure -- some working process...
@input1 = @input1
....
,@delay = @delay output
WAITFOR DELAY @delay
END
END
澄清:
我必须在很长一段时间内做一些重复的工作。我必须开始这个过程并停止它。为什么是存储过程?我必须为 [some work] 更改一些输入参数,并在延迟一段时间后再次调用它。也许你知道其他更聪明的方法来实现它。这个循环过程应该在数据库中工作。
如果您希望存储过程仅由一个进程调用而没有其他并发调用者,则可以使用sp_getapplock。请注意,您必须为第二个进程抛出错误(超时为零),但您可以通过 BEGIN TRY/CATCH 安排来解决这个问题。
然后你会在存储过程完成时释放它。
请注意,存储过程的这种使用基本上是错误的。您将让 SQL Server 代理每分钟运行一次存储过程。您可能希望 sp_getapplock 也阻止手动执行,但 SQL Server 代理不允许对同一作业进行重叠调用。
或者触发器与 SQL Agent 或 Service Broker 队列中的警报一起使用。我们没有足够的信息:您已就所选的代码级解决方案寻求帮助。我们不知道您要解决的问题
如果这是一个单一的工作单元,那么你需要一个事务,而 12-24 小时的事务是完全错误的