Tentei chamar um procedimento armazenado do SQL Server em outra sessão.
Este é meu código:
CREATE PROCEDURE [dbo].[CI_AdHoc_PrepareJob]
(
@JobName NVARCHAR(50),
@StepName NVARCHAR(50),
@Value NVARCHAR(MAX)
)
AS
BEGIN
BEGIN TRAN;
DECLARE @MyStepName SYSNAME = @StepName + '_' + CAST(NEWID() AS NVARCHAR(36));
DECLARE @MyCmd NVARCHAR(MAX) = 'EXEC CI_AdHoc_SP @id=1, @value=''' + @Value + '''';
-- Call helper to create the job step immediately
EXEC dbo.sp_add_jobstep
@jobname = @JobName,
@stepname = @myStepName,
@subsystem = N'TSQL',
@command = @MyCmd,
@on_success_action = 1, -- Quit with success
@on_fail_action = 2, -- Quit with failure
@DatabaseName = 'MyDB';
-- Now start the job
EXEC msdb.dbo.sp_start_job
@job_name = @JobName,
@step_name = @MyStepName;
-- Get Job ID (optional)
DECLARE @JobId UNIQUEIDENTIFIER;
SELECT @JobId = job_id FROM msdb.dbo.sysjobs WHERE name = @JobName;
ROLLBACK TRAN;
END
Quero que, mesmo que eu faça um rollback no final, o procedimento armazenado seja executado (sem que o rollback interfira. Ele é usado para algumas atualizações no banco de dados, por exemplo).
Como posso fazer isso?
Executar trabalho com parâmetro é uma boa solução.
(Pode ser que não haja problema se não houver parâmetros para o procedimento armazenado, mas preciso passar parâmetros, então preciso chamar sp_add_jobstep
dentro da transação. Não encontrei outra maneira de fazer isso).