我们说我们有这个程序:
create procedure procDoSomeJob
as
begin
print 'Step 1';
exec procStep1;
print 'Step 2';
exec procStep2; -- This step raises a primary key violation
print 'Step 3';
exec procStep3;
end;
因此,此过程调用其他过程,这些过程执行一些SQL语句(INSERT,UPDATE)。
假设proc_Step2引发错误(例如主键冲突)。
现在,我创建了一个作业,在那里,这个过程就像这样调用:
exec dbo.procDoSomeJob;
现在有趣的部分:
作业运行后,在SQL Mgmt Studio中,我会看到"作业历史"那是一个错误而且工作"失败"。
另外,在说明中,我看到输出
第1步第2步 ( - >没有"步骤3")
但是在查看数据时,实际上,过程procStep3已经执行了!
那么为什么我看不到
的输出PRINT 'Step 3';
但是
EXEC procStep3;
实际执行了吗?
答案 0 :(得分:0)
我可以通过一个简单的示例复制此行为,由SQL代理作业执行,就像您描述的那样:
CREATE PROCEDURE procDoSomeJob
AS
BEGIN
PRINT 'Step 1';
PRINT 'Step 2';
RAISERROR('error!', 16,1)
PRINT 'Step 3';
END;
似乎一旦发生错误,"消息"即使出现另一个错误,作业历史记录中的字段也会停止捕获命令的任何其他输出。如果有记录(很可能是这样),我还没有找到相关的MSDN条目。
如果您想确定第3步已执行,您需要在日志表中插入消息,而不是依赖PRINT
的输出。