SQL Server Try/Catch, Begin/Tran, RaiseError, Loop и Return. Какой правильный порядок?

У меня есть следующая процедура. (Синтаксис не идеален, просто хочу дать вам, ребята, идею).

begin tran

begin try

while loop
  some condition, if true
   raiseerror('error', 16, 1)

end try
begin catch
  if transaction > 0
    rollback tran
  select error message
end catch

if transaction > 0
  commit tran

Вопросы:

  1. Будет ли ошибка повышения вызывать блокировку захвата? Если да, будет ли транзакция полностью отменена (для всех итераций цикла)?

  2. Я хочу, чтобы № 1 был таким, нужно ли добавлять "RETURN" после отката trans?

Я задаю этот вопрос, потому что кажется, что цикл продолжился даже после некоторой ошибки в итерации.

1 ответ

Решение

Взгляните на этот вопрос (искренне заданный вами): SQL Server XACT_ABORT с исключением

Хотя вопрос немного отличался, он показывает базовую структуру того, как выполнить то, что вы пытаетесь сделать.

30-секундное краткое изложение будет следующим: используйте блоки try/catch, как вы это делали, и в конце вашей процедуры создайте раздел под названием "fail", к которому будут обращаться все захваты. Вы можете установить сообщение в каждом улове для регистрации или передать ошибку конечному пользователю.

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