我有一个存储过程......
exec dbo.usp_Log 'Start to run job job1'
Exec @intErrorCode = msdb.dbo.sp_start_job 'job1'
IF @intErrorCode <> 0 Goto errorHandling
exec dbo.usp_Log 'End to run job job1'
......
,其逻辑如下:
Exec @intErrorCode = msdb.dbo.sp_start_job 'job1'
但是当我运行这个存储过程时,它被卡住了,当我检查日志时,我只能看到消息&#39;开始运行作业job1&#39;。同样在SQL Server代理作业监视器中,我看不到此作业被触发。
但如果我手动运行
categoryList.setModel(dataModel);
它工作正常。
SQL Server是Microsoft SQL Server 2005企业版(版本9.00.5000.00)
答案 0 :(得分:1)
事实证明是某种SQL Server错误(也许SQL Server 2005已经很老了)。存储过程意外结束,并且不返回任何代码。
因此,通过将此msdb.dbo.sp_start_job过程之前的所有逻辑移动到单独的存储过程中来解决问题。
希望它可以帮助那些遇到同样问题的人。
答案 1 :(得分:0)
您的工作可能无法启动并分支到代码的errorHandling
部分。如果您先将@@ERROR_MESSAGE
添加到日志中,那么您将在日志中看到问题。类似的东西:
exec dbo.usp_Log 'Start to run job job1'
begin try
Exec @intErrorCode = msdb.dbo.sp_start_job 'job1'
end try
begin catch
exec dbo.usp_Log 'Error: ' + ERROR_MESSAGE()
Goto errorHandling
end catch
exec dbo.usp_Log 'End to run job job1'
更新
我在我的服务器上运行了测试。我尝试启动已经运行的作业并返回错误,但未触发catch块。显然这是sp_start_job的问题。这可能是你的一些困惑的根源。这里有一个解决方法:TRY/CATCH does not work on SQL Server Agent error?
我最好的猜测是,当代码在不同的用户上下文下运行时存在权限问题。您可以将代码包装为将作业运行到在不同安全上下文下执行的过程中......如下所示:
create procedure dbo.sp_RunJob1
with execute as owner
as
exec sp_start_job @job_name = 'job1'
然后在代码中调用sp_RunJob1而不是sp_start_job语句。