Поднимите ошибку вручную в T-SQL, чтобы перейти к блоку BEGIN CATCH
Можно ли вручную вызвать ошибку в хранимой процедуре, чтобы остановить выполнение и перейти в блок BEGIN CATCH
? Некоторый аналог throw new Exception()
в C#
.
Вот мой кусок хранимой процедуры:
BEGIN TRY
BEGIN TRAN
-- do something
IF @foobar IS NULL
-- here i want to raise an error to rollback transaction
-- do something next
COMMIT TRAN
END TRY
BEGIN CATCH
IF @@trancount > 0
ROLLBACK TRAN
END CATCH
Я знаю один способ: SELECT 1/0
Но это ужасно!!
Ответы
Ответ 1
вы можете использовать raiserror
. Подробнее здесь
- из 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
Вы можете использовать THROW
(доступно в SQL Server 2012 +):
THROW 50000, 'Your custom error message', 1
THROW <error_number>, <message>, <state>
MSDN THROW (Transact-SQL)
Различия между RAISERROR и THROW на сервере Sql
Ответ 3
Вы ищете RAISERROR
.
Из MSDN:
Создает сообщение об ошибке и инициирует обработку ошибок для сессия. RAISERROR может либо ссылаться на пользовательское сообщение хранится в каталоге sys.messages просматривать или строить сообщение динамически. Сообщение возвращается как сервер сообщение об ошибке для вызывающего приложения или связанного с ним CATCH блок конструкции TRY... CATCH.
CodeProject имеет хорошую статью, в которой также подробно описываются детали того, как она работает и как ее использовать.
Ответ 4
SQL имеет механизм повышения ошибок
RAISERROR ( { msg_id | msg_str | @local_variable }
{ ,severity ,state }
[ ,argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]
Просто найдите Raiserror в онлайн-книгах. Но.. вы должны сгенерировать ошибку соответствующей серьезности, ошибка с серьезностью 0-10 до 10 не заставит вас перейти к блоку catch.
Ответ 5
Вызывает исключение и передает выполнение блоку CATCH конструкции TRY... CATCH в SQL Server 2017.
Пожалуйста, обратитесь к приведенной ниже ссылке
Исключение Throw T-SQL