sql >> Database >  >> RDS >> Sqlserver

Moet ik een try..catch-blok en expliciete rollback gebruiken in een SQL Server-procedure?

Het antwoord op uw vraag hangt af van de SET XACT_ABORT instelling:

Probeer bijvoorbeeld de volgende code. De eerste deling door 0 levert een fout op, maar gaat door met uitvoeren . De tweede deling door nul levert een fout op en stopt de uitvoering:

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

Als XACT_ABORT AAN is, zullen fouten de transactie afbreken en hebt u geen TRY / CATCH nodig.

Als XACT_ABORT UIT staat, moet u de status van elke instructie controleren om te zien of er een fout is opgetreden:

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

Als u echter ooit een geval vindt waarin u moet PROBEREN / VANGEN, moet u mogelijk iets speciaals doen wanneer de fout optreedt. Als dit het geval is, vergeet dan niet om de uitzonderingsbehandeling te TRY / CATCH:

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-ontwerp:wat heeft het voor zin om externe sleutels te identificeren?

  2. SQL AS:gebruik, voorbeelden en hoe u er het beste van kunt profiteren

  3. Retourrij met de maximale waarde van één kolom per groep

  4. * Niet-herkend veld bij:database Bedoelde u?:- metrische gegevens - server - logging - DROPWIZARD