Dado o seguinte trabalho do SQL Server Agent
USE [msdb]
GO
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
END
DECLARE @jobId BINARY(16)
EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Do Nothing',
@enabled=1,
@notify_level_eventlog=0,
@notify_level_email=0,
@notify_level_netsend=0,
@notify_level_page=0,
@delete_level=0,
@description=N'No description available.',
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'Me', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Wait',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=1,
@on_success_step_id=0,
@on_fail_action=2,
@on_fail_step_id=0,
@retry_attempts=0,
@retry_interval=0,
@os_run_priority=0, @subsystem=N'TSQL',
@command=N'WAITFOR DELAY ''00:00:10''',
@database_name=N'master',
@flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:
GO
E o seguinte código de chamada
EXEC msdb.dbo.sp_start_job @job_name = 'Do nothing' -- waits for 10 seconds
WAITFOR DELAY '00:00:05'
EXEC msdb.dbo.sp_start_job @job_name = 'Do nothing' -- fails, job still running
WAITFOR DELAY '00:00:10'
EXEC msdb.dbo.sp_start_job @job_name = 'Do nothing' -- should succeed
Recebo o seguinte erro:
Job 'Do nothing' started successfully. Msg 22022, Level 16, State 1, Line 25 SQLServerAgent Error: Request to run job Do Nothing (from User Me) refused because the job is already running from a request by User Me. Job 'Do nothing' started successfully.
Então podemos ver que a segunda sp_start_job
chamada falhou porque o trabalho ainda estava em execução, então o SQL Server continuou a execução
a falha é nível 16 e quando eu faço o seguinte
PRINT 'hello'
RAISERROR ('error',16,1)
PRINT 'hello'
Recebo o mesmo comportamento de "falhar e continuar"
hello
Msg 50000, Level 16, State 1, Line 50
error
hello
no entanto, se eu fizer o seguinte, o que também gera um erro de nível 16, a segunda impressão não será executada
PRINT 'hello'
;THROW 51000, 'error', 1;
PRINT 'hello'
hello
Msg 51000, Level 16, State 1, Line 50
error
Os documentos para o estado THROW
Qualquer erro que ocorra em uma instrução THROW faz com que o lote de instruções seja encerrado.
Os documentos para o estado RAISERROR
O erro é retornado ao chamador se RAISERROR for executado: Fora do escopo de qualquer bloco TRY. Com uma gravidade de 10 ou menor em um bloco TRY. Com uma gravidade de 20 ou maior que encerra a conexão com o banco de dados.
Minha pergunta é: sp_start_job
usar RAISERROR em vez de throw - Eu olhei a definição e não consigo ver se em algum lugar