我通过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吗?
答案 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