我尝试在另一个会话中调用 SQL Server 存储过程。
这是我的代码:
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
我希望即使我在最后进行回滚,存储过程也能运行(不受回滚干扰。它用于数据库中的某些更新)。
我怎样才能做到这一点?
是否使用参数运行作业-一个很好的解决方案。
(存储过程没有参数可能也没问题,但是我需要传递参数,所以需要sp_add_jobstep
在事务内部调用。除此之外,我没有找到其他方法)。