EXEC和PRINT在一份工作中

时间:2015-03-05 15:17:38

标签: sql-server stored-procedures sql-server-2008-r2

我们说我们有这个程序:

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;

实际执行了吗?

1 个答案:

答案 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的输出。