Во вложенных хранимых процедурах - как безопасно продолжить выполнение вызывающей процедуры, даже если внутренняя процедура не удалась?

У меня есть один сценарий, в котором у меня есть вложенные хранимые процедуры. Я хочу, чтобы моя основная процедура продолжала работать, даже если вызываемая процедура (она просто ведет журнал в таблице) не выполнялась успешно. не могли бы вы помочь? огромное спасибо!

основная хранимая процедура

exec testSP -- Внутренний SP

-- Я хочу, чтобы следующий код основного SP выполнялся, даже если внутренний SP выходит из строя или когда-то возникают проблемы или что-то еще, что приводит к сбою

код для основного ИП

Какую базу данных вы используете?

Squirrel 02.11.2022 05:49

@Squirrel SQL-сервер

SqlLearner 02.11.2022 07:36
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
91
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать 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 02.11.2022 10:55

@SqlLearner Нет, если вы поместите код, который хотите запустить, в блок catch, он будет выполняться только в случае сбоя внутренней процедуры. Просто поместите код после блока catch. Обработчик try/catch должен быть обернут только вокруг той единицы работы, с которой вы ожидаете сбой. Я предполагаю, что вы могли бы написать это так, чтобы после вызова процедуры вы вызывали ошибку вручную, так что ловушка вводится независимо от того, успешно или нет процедура, но это не будет интуитивно понятным для будущих сопровождающих.

Stuck at 1337 02.11.2022 13:09

я редактирую свой awnser - например, когда возникает ошибка, вы можете указать номер ошибки и сообщение об ошибке ... так легче увидеть, где возникла ошибка. Основная хранимая процедура будет продолжена после обработки блока catch.

Falko 02.11.2022 13:19

@RhythmWasaLurker Большое спасибо, прояснил мою путаницу :)

SqlLearner 04.11.2022 02:07

BEGIN TRY EXEC populate_logfile SET LOCK_TIMEOUT 5000 -- эта процедура записывает результаты в журнал. --Ничего не возвращается, чтобы избежать сбоя этого процесса. КОНЕЦ ПОПРОБУЙ НАЧАТЬ ПОЛУЧАТЬ ВЫБЕРИТЕ ERROR_NUMBER(), ERROR_MESSAGE() КОНЕЦ ПОЛУЧАТЬ

SqlLearner 04.11.2022 05:14

это правильный способ сделать это? я хочу тайм-аут через 5 секунд, поймать ошибку, а затем продолжить мой следующий код main sp. Пожалуйста, предложите, спасибо.

SqlLearner 04.11.2022 05:16

Другие вопросы по теме