从C#中触发并忘记Sql Server存储过程

前端之家收集整理的这篇文章主要介绍了从C#中触发并忘记Sql Server存储过程前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在排队工作,在每项工作结束时,我想要启动一个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来启动作业.它将立即返回,因为开始工作很快.然后工作运行,你可以“忘记”它.

这是sql代理作业方法的一些解雇和遗忘代码.

string sql =“EXEC dbo.sp_start_job’你的工作名称’”;

然后在数据库上执行该操作.它应该立即返回.如果成功则返回0,如果不成功则返回1.见here.

您无法将参数传递给作业.因此,如果需要,您可以创建一个包含您想要传递的参数的表.然后,在调用sp_start_job SP之前,需要使用希望SP使用的参数更新表.然后,您还需要SP查看该表并查看要使用的参数.这很容易.

就是这样.火与忘记.

猜你在找的C#相关文章