微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从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查看该表并查看要使用的参数.这很容易.

就是这样.火与忘记.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐