Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Czy muszę używać bloku try..catch i jawnego wycofywania w procedurze SQL Server?

Odpowiedź na Twoje pytanie zależy od SET XACT_ABORT ustawienie:

Na przykład wypróbuj następujący kod. Pierwsze dzielenie przez 0 powoduje błąd, ale kontynuuje wykonywanie . Drugie dzielenie przez zero powoduje błąd i zatrzymuje wykonanie:

begin transaction

set xact_abort off
    
select 1 / 0 -- causes divide by zero error, but continues
select @@trancount -- returns 1

set xact_abort on

select 1 / 0 -- causes divide by zero error and terminates execution
select @@trancount -- we never get here

rollback

Jeśli XACT_ABORT jest WŁĄCZONE, błędy spowodują przerwanie transakcji i nie potrzebujesz opcji TRY / CATCH.

Jeśli XACT_ABORT jest WYŁĄCZONE, musisz sprawdzić stan każdej instrukcji, aby zobaczyć, czy wystąpił błąd:

begin transaction

delete from...
if @@error <> 0
begin
    if @@trancount > 0
        rollback
    return
end

insert into...
if @@error <> 0
begin
    if @@trancount > 0
        rollback
    return
end

commit

Jeśli jednak kiedykolwiek znajdziesz przypadek, w którym musisz TRY / CATCH, być może będziesz musiał zrobić coś specjalnego, gdy wystąpi błąd. Jeśli tak, nie zapomnij TRY / CATCH obsługi wyjątków:

begin transaction

set xact_abort on

begin try
    select 1 / 0 -- causes divide by zero error and terminates execution
    select @@trancount -- we never get here
    commit
end try
begin catch
    select xact_state() -- this will be -1 indicating you MUST rollback before doing any other operations
    select @@trancount -- this will probably be one, because we haven't ended the transaction yet
    if xact_state() <> 0
    begin try
        select 'rollback'
        rollback
        
        -- do something to handle or record the error before leaving the current scope
        select 'exception processing here'
        --insert into...
    end try
    begin catch
        -- ignore rollback errors
    end catch
    
end catch


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wykonywanie procedury składowanej z funkcji

  2. Najbezpieczniejszy sposób na uzyskanie ostatniego identyfikatora rekordu z tabeli

  3. Wprowadzenie do funkcji zdefiniowanych przez użytkownika w SQL Server

  4. Sortowanie danych dla źródła PIVOT

  5. Zawijaj tekst w serwerze SQL za pomocą funkcji