Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Dois-je utiliser un bloc try..catch et une restauration explicite dans une procédure SQL Server ?

La réponse à votre question dépend du SET XACT_ABORT réglage :

Par exemple, essayez le code suivant. La première division par 0 génère une erreur mais continue l'exécution . La deuxième division par zéro génère une erreur et stoppe l'exécution :

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

Si XACT_ABORT est activé, les erreurs interrompront la transaction et vous n'aurez pas besoin d'un TRY / CATCH.

Si XACT_ABORT est désactivé, vous devrez vérifier le statut de chaque instruction pour voir si une erreur s'est produite :

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

Cependant, si jamais vous trouvez un cas où vous devez TRY / CATCH, vous devrez peut-être faire quelque chose de spécial lorsque l'erreur se produit. Si c'est le cas, n'oubliez pas de TRY / CATCH la gestion des exceptions :

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