У меня есть один сценарий, в котором у меня есть вложенные хранимые процедуры. Я хочу, чтобы моя основная процедура продолжала работать, даже если вызываемая процедура (она просто ведет журнал в таблице) не выполнялась успешно. не могли бы вы помочь? огромное спасибо!
основная хранимая процедура
exec testSP -- Внутренний SP
-- Я хочу, чтобы следующий код основного SP выполнялся, даже если внутренний SP выходит из строя или когда-то возникают проблемы или что-то еще, что приводит к сбою
код для основного ИП
@Squirrel SQL-сервер
Вы можете использовать try-catch внутри вашей основной хранимой процедуры (и/или вашего testSP).
BEGIN TRY
EXEC testSP
END TRY
BEGIN CATCH
-- do something when an error occurs
SELECT ERROR_NUMBER(), ERROR_MESSAGE(), 'testSP'
END CATCH
я хочу продолжить работу с кодом основной хранимой процедуры даже после ошибки, тогда я должен написать этот код в блоке catch? продолжать?
@SqlLearner Нет, если вы поместите код, который хотите запустить, в блок catch, он будет выполняться только в случае сбоя внутренней процедуры. Просто поместите код после блока catch. Обработчик try/catch должен быть обернут только вокруг той единицы работы, с которой вы ожидаете сбой. Я предполагаю, что вы могли бы написать это так, чтобы после вызова процедуры вы вызывали ошибку вручную, так что ловушка вводится независимо от того, успешно или нет процедура, но это не будет интуитивно понятным для будущих сопровождающих.
я редактирую свой awnser - например, когда возникает ошибка, вы можете указать номер ошибки и сообщение об ошибке ... так легче увидеть, где возникла ошибка. Основная хранимая процедура будет продолжена после обработки блока catch.
@RhythmWasaLurker Большое спасибо, прояснил мою путаницу :)
BEGIN TRY EXEC populate_logfile SET LOCK_TIMEOUT 5000 -- эта процедура записывает результаты в журнал. --Ничего не возвращается, чтобы избежать сбоя этого процесса. КОНЕЦ ПОПРОБУЙ НАЧАТЬ ПОЛУЧАТЬ ВЫБЕРИТЕ ERROR_NUMBER(), ERROR_MESSAGE() КОНЕЦ ПОЛУЧАТЬ
это правильный способ сделать это? я хочу тайм-аут через 5 секунд, поймать ошибку, а затем продолжить мой следующий код main sp. Пожалуйста, предложите, спасибо.
Какую базу данных вы используете?