Как вызвать ошибку, которую SQL увидит как сбой задания? - PullRequest
8 голосов
/ 11 мая 2011

У меня запланировано задание через агент SQL Server, который запускает sproc, который запускает некоторые другие sprocs.Каждый 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 ]

10 голосов
/ 17 октября 2012

Поднимите ошибку в блоке 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;
2 голосов
/ 04 августа 2011

Каждый шаг задания имеет действие для сбоя шага, они должны быть настроены на провал всего задания.Ваш, вероятно, настроен на переход только к следующему шагу.

0 голосов
/ 27 марта 2017

Если уровень серьезности вашей ошибки равен 20 или выше, соединение с базой данных будет прервано.Это приведет к сбою шага.Пока ваш шаг настроен так, что задание не будет выполнено, если шаг завершится неудачей, вы получите желаемый результат.

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

СМ. MSDN описание RAISERROR: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/raiserror-transact-sql

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...