Eu tenho que iniciar o processo cíclico em um procedimento armazenado e, em seguida, pará-lo após algum tempo (após 12 a 24 horas). O trabalho do procedimento armazenado não deve ser iniciado duas vezes. O cliente SQL Server (chamador) não deve esperar e não deve obter tempo limite de execução. Como pode ser implementado?
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
Esclarecimento:
Eu tenho que fazer algum trabalho repetido durante muito tempo. Eu tenho que iniciar este processo e pará-lo. Por que procedimento armazenado? Tenho que alterar alguns parâmetros de entrada para [algum trabalho] e chamá-lo novamente após algum atraso. Talvez você conheça outra maneira mais inteligente de implementá-lo. Este processo cíclico deve funcionar no banco de dados.
Se você deseja que o procedimento armazenado seja invocado por apenas um processo sem outros chamadores simultâneos, use sp_getapplock . Observe que você teria que lançar um erro para um segundo processo (com tempo limite zero), mas você pode engolir isso com um arranjo BEGIN TRY/CATCH.
Então você o liberaria quando o procedimento armazenado terminasse.
Observe que esse uso de um procedimento armazenado está basicamente errado. Você teria o SQL Server Agent executando o procedimento armazenado a cada minuto. Você pode querer sp_getapplock para evitar a execução manual também, mas o SQL Server Agent não permitirá chamadas sobrepostas para o mesmo trabalho.
Ou o gatilho é com alertas nas filas do SQL Agent ou do Service Broker. Não temos informações suficientes: você pediu ajuda com a solução de nível de código escolhida. Não sabemos o problema que você está tentando resolver
Se esta é uma única unidade de trabalho, então você precisa de uma transação, e uma transação de 12 a 24 horas está totalmente errada