Tentando usar sp_stop_job
para parar um trabalho simples que insere dados em uma tabela quando 100 linhas foram inseridas, fiquei confuso ao ver a tabela acabar com mais de 100 linhas todas as vezes. Na seção Observações do sp_stop_job
documento, diz:
sp_stop_job envia um sinal de parada ao banco de dados. Alguns processos podem ser interrompidos imediatamente e alguns devem atingir um ponto estável (ou um ponto de entrada para o caminho do código) antes de poderem parar.
Não entendo o que significa atingir um ponto estável (ou um ponto de entrada para o caminho do código) e acredito que o trabalho continua inserindo os dados na tabela porque ainda está atingindo esse ponto estável.
O código:
CREATE TABLE [dbo].[myStopJobTable](
[id] [int] NULL,
[nome] [varchar](50) NULL
);
Criei um job com uma etapa para executar o seguinte código:
WHILE (1=1)
BEGIN
INSERT INTO MyLab.dbo.myStopJobTable
VALUES (1, 'Some Name');
IF ((SELECT COUNT(*) FROM myStopJobTable) = 100)
BEGIN
EXEC msdb.dbo.sp_stop_job N'JobToBeStopped';
END
END;
A partir desse código de exemplo, eu esperava que o trabalho parasse antes que a linha 101 fosse inserida, mas isso não acontece. Ao adicionar um BREAK
dentro do IF
bloco, o processo é interrompido antes que a inserção da linha 101 aconteça, mas nesse caso não está sp_stop_job
funcionando.
Não quero uma correção para o trabalho, o que procuro é entender esse ponto estável (ou um ponto de entrada para o caminho do código) . O que isto significa?
O trabalho não está esperando para "atingir um ponto estável". O ponto chave é:
sp_stop_job
envia a solicitação de parada do SQL Server Agent, mas não espera que ela seja concluída. O script T-SQL continua enquanto o SQL Server Agent processa a solicitação de parada de forma assíncrona. As linhas adicionais inseridas apóssp_stop_job
a execução refletem o tempo entre o recebimento da solicitação de parada até que o SQL Server Agent conseguiu cancelá-la. Isso normalmente leva alguns milissegundos ou mais, dependendo da atividade geral.A observação sobre "atingir um ponto estável" no contexto de uma etapa de trabalho T-SQL é a mesma de qualquer solicitação de cancelamento de consulta. Inclui o tempo que o mecanismo de banco de dados precisa para liberar recursos e reverter a transação. Esse tempo é insignificante com a inserção singleton em seu exemplo, mas seria mais perceptível se o script cancelado tivesse feito mais trabalho, como inserir milhões de linhas em uma única transação.