如何引发SQL将作为作业失败的错误?

8 sql-server sql-server-2008

我通过SQL Server代理程序安排了一个作业,该代理程序运行一个运行其他一些sprocs的sproc.每个sproc看起来像这样:

BEGIN TRY
    -- do stuff
END TRY
BEGIN CATCH
    DECLARE @errorMessage varchar(4000)
    DECLARE @procName varchar(255)
    SELECT @errorMessage = error_message()
    SELECT @procName = OBJECT_NAME(@@PROCID)

    RAISERROR('%s threw an exception: %s', 16, 1, @procName, @errorMessage)
END CATCH
Run Code Online (Sandbox Code Playgroud)

这一切都很好 - 错误被提升并被抛到堆栈,生活是美好的.但是,我的RAISERROR调用似乎不会导致作业失败 - 我将设置为接收电子邮件通知"当作业失败时",但从未收到.电子邮件通知正在运行,因为如果我将通知更改为"作业成功时",我将收到电子邮件.我应该使用其他功能代替RAISERROR吗?

小智 10

在try块中引发错误,TRY块中的严重性在11-19之间,然后在catch块中重新引发相同的错误.这将使步骤失败..

来自msdn的代码片段

BEGIN TRY
-- RAISERROR with severity 11-19 will cause execution to 
-- jump to the CATCH block.
RAISERROR ('Error raised in TRY block.', -- Message text.
           16, -- Severity.
           1 -- State.
           );
END TRY

BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;

SELECT 
    @ErrorMessage = ERROR_MESSAGE(),
    @ErrorSeverity = ERROR_SEVERITY(),
    @ErrorState = ERROR_STATE();

-- Use RAISERROR inside the CATCH block to return error
-- information about the original error that caused
-- execution to jump to the CATCH block.
RAISERROR (@ErrorMessage, -- Message text.
           @ErrorSeverity, -- Severity.
           @ErrorState -- State.
           );
END CATCH;
Run Code Online (Sandbox Code Playgroud)


Thi*_*tas 2

每个作业步骤都有一个针对步骤失败的操作,它们必须设置为使整个作业失败。您的可能只会进入下一步。