2012-06-21 24 views
8

Stavo leggendo sulla gestione degli errori in SQL Server in this article e suggeriscono di utilizzare GOTO di SQL Server in determinate situazioni per eseguire il rollback della transazione. Esempio:Non è consigliabile utilizzare GOTO di SQL Server per la gestione degli errori?

BEGIN TRAN 
    UPDATE Authors 
    SET Phone = '415 354-9866' 
    WHERE au_id = '724-80-9391' 

    SELECT @intErrorCode = @@ERROR 
    IF (@intErrorCode <> 0) GOTO PROBLEM 

    UPDATE Publishers 
    SET city = 'Calcutta', country = 'India' 
    WHERE pub_id = '9999' 

    SELECT @intErrorCode = @@ERROR 
    IF (@intErrorCode <> 0) GOTO PROBLEM 
COMMIT TRAN 

PROBLEM: 
IF (@intErrorCode <> 0) BEGIN 
PRINT 'Unexpected error occurred!' 
    ROLLBACK TRAN 
END 

Questo articolo è stato scritto quasi 10 anni fa, e ho sentito che di solito è una cattiva idea di usare GOTO. Il metodo sopra è ok per la gestione degli errori in SQL Server? Se no, qualcuno può suggerire un'alternativa migliore?

+0

Hai controllato questo [risposta] (http://stackoverflow.com/a/ 11153012/1451723)? – Pankaj

risposta

15

Si deve usare Try/Catch in SQL 2005+

BEGIN TRY 
    BEGIN TRAN 

    UPDATE Authors 
    SET Phone = '415 354-9866' 
    WHERE au_id = '724-80-9391' 

    UPDATE Publishers 
    SET city = 'Calcutta', country = 'India' 
    WHERE pub_id = '9999' 

    COMMIT TRAN   
END TRY 
BEGIN CATCH 
    PRINT 'Unexpected error occurred!' 
    IF XACT_STATE() <> 0 
     ROLLBACK TRAN  
END CATCH 
5

È necessario incorporare SET XACT_ABORT ON in Exception handling

Begin Try 
SET XACT_ABORT ON 

BEGIN TRAN 
    UPDATE Authors 
    SET Phone = '415 354-9866' 
    WHERE au_id = '724-80-9391' 

    UPDATE Publishers 
    SET city = 'Calcutta', country = 'India' 
    WHERE pub_id = '9999' 
COMMIT TRAN 

End Try 

Begin Catch 
    Rollback Tran 
End Catch