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

时间:2011-05-11 12:12:59

标签: 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

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

3 个答案:

答案 0 :(得分:10)

在TRY块中严重性为11-19的try块中引发错误,然后在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;

答案 1 :(得分:2)

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

答案 2 :(得分:0)

如果您的错误严重性级别为20或更高,则数据库连接将终止。这将导致步骤失败。只要您设置了步骤,以便在步骤失败时作业失败,您将获得所需的结果。

RAISERROR('%s threw an exception: %s', 20, 1, @procName, @errorMessage) WITH LOG;

SEE msdn对RAISERROR的描述:https://docs.microsoft.com/en-us/sql/t-sql/language-elements/raiserror-transact-sql