【问题标题】:EXEC and PRINT in a job在工作中执行和打印
【发布时间】:2015-03-05 15:17:37
【问题描述】:

假设我们有这个程序:

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;

真的被执行了吗?

【问题讨论】:

  • 在procStep2里面存在proc procStep3 :)

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


【解决方案1】:

我可以用一个简单的例子来复制这种行为,就像你描述的那样,由 SQL 代理作业执行:

CREATE PROCEDURE procDoSomeJob 
AS  
BEGIN
    PRINT 'Step 1';

    PRINT 'Step 2';
    RAISERROR('error!', 16,1)

    PRINT 'Step 3';

END;

似乎一旦发生错误,作业历史记录中的“消息”字段将停止捕获命令的任何进一步输出,即使引发另一个错误也是如此。如果这是记录在案的(很可能是这样),我还没有找到相关的 MSDN 条目。

如果您想确定第 3 步是否已执行,您需要将消息插入日志表,而不是依赖于 PRINT 的输出。

【讨论】:

  • 谢谢;是的,的确, PRINT() 似乎停止了,但其他程序仍在运行。有趣的是,如果您在 SQL Studio 中的脚本中执行该过程,那么您将获得完整的输出。似乎在作业中执行时, PRINT() 的行为是不同的。
猜你喜欢
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
  • 2017-10-30
相关资源
最近更新 更多