Скажите SQL Server, что ошибка "обработана" в try ... catch - PullRequest
0 голосов
/ 20 мая 2010

Я бы хотел указать SQL Server 2005, в моем блоке BEGIN CATCH ... END CATCH, что ошибка «обработана» ... То есть очистить ошибку.

Это возможно? Учтите это:

begin transaction 
  begin try 
    begin transaction 

      select cast('X' as bit) 
    commit transaction 
   end try 
 begin catch rollback transaction 

   select error_number(), error_message() 
 end catch 

 commit transaction 

Это приводит к следующему:

(0 row(s) affected)

(No column name)    (No column name)
245 Conversion failed when converting the varchar value 'X' to data type bit.

(1 row(s) affected)
Msg 3902, Level 16, State 1, Line 13
The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.

Спасибо. A.

1 Ответ

2 голосов
/ 20 ноября 2010

Не все ошибки маскируются. Вы всегда должны проверять XACT_STATE() и посмотреть, сможете ли вы продолжить. Некоторые ошибки (типичный пример блокировки 1205) откатят транзакцию и не позволят вам продолжить.

То, что вы описываете (цикл, который может сохранить работу), обычно выполняется с помощью точки сохранения:

begin transaction
begin try
while @loopcondition
begin
   save transaction loop;
   begin try
      -- process loop element here
   end try
   begin catch
     if xact_state() = -1
     begin
        -- whole transaction is doomed
        rollback;
        raiserror ('Aborting', ....);
     end
     else if xact_state() = 0
     begin
        -- trasaction was aborted by inner loop
        raiserror ('Aborted inside', ....);
     end  
     else if xact_state() = 1
     begin
       -- this error is recoverable, rollback to the savepoint and continue the loop
       rollback loop
     end
   end catch 
   -- continue loop here
   fetch next from ....
/*   
   -- batch commit here if batch committing
   if @batchsize 
   begin
      commit;
      begin transaction 
   end
*/
end
commit;
end try
begin catch
  -- if we get here, we could not handle the error inside the loop and continue
  if xact_state() != 0
    rollback
  raiserror('failed to process', ...)
end catch
...