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

就是这样.火与忘记.

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString(&quot;x2&quot;));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable&lt;Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include &quot;WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...