我正在排队工作,在每项工作结束时,我想要启动一个SP,它将对数据进行大量处理.所以我不想等待SP完成,我只想在触发SP后立即转到下一个工作.存储过程将从触发代码中获取输入.
问题:-
这是我创建工作的脚本.请注意,我没有添加任何计划.
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'job_JobName',@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'UserName',@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'StepName',@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'exec dbo.SpToExecute',@database_name=N'DataBaseName',@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:
现在,当我通过执行EXEC msdb.dbo.job_JobName’开始这项工作时,它没有执行dbo.SpToExecute.我需要在作业中只运行一次dbo.SpToExecute,然后作业应该停止.再次当我执行EXEC msdb.dbo.job_JobName’时,它应该再次运行exec dbo.SpToExecute一次.你能告诉我如何实现这个或我在这里缺少的东西吗?
解决方法
您可以使用
BeginExecuteNonQuery或其他异步方法,或者您可以创建将运行SP的sql作业,然后只需调用常规同步ExecuteNonQuery来启动作业.它将立即返回,因为开始工作很快.然后工作运行,你可以“忘记”它.
string sql =“EXEC dbo.sp_start_job’你的工作名称’”;
然后在数据库上执行该操作.它应该立即返回.如果成功则返回0,如果不成功则返回1.见here.
您无法将参数传递给作业.因此,如果需要,您可以创建一个包含您想要传递的参数的表.然后,在调用sp_start_job SP之前,需要使用希望SP使用的参数更新表.然后,您还需要SP查看该表并查看要使用的参数.这很容易.
就是这样.火与忘记.