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 был таким, нужно ли добавлять "RETURN" после отката trans?
Я задаю этот вопрос, потому что кажется, что цикл продолжился даже после некоторой ошибки в итерации.
1 ответ
Взгляните на этот вопрос (искренне заданный вами): SQL Server XACT_ABORT с исключением
Хотя вопрос немного отличался, он показывает базовую структуру того, как выполнить то, что вы пытаетесь сделать.
30-секундное краткое изложение будет следующим: используйте блоки try/catch, как вы это делали, и в конце вашей процедуры создайте раздел под названием "fail", к которому будут обращаться все захваты. Вы можете установить сообщение в каждом улове для регистрации или передать ошибку конечному пользователю.