2012-06-21 19 views
8

Czytałem o obsłudze błędów w SQL Server w this article i sugerują one użycie GOTO programu SQL Server w niektórych sytuacjach do wycofania transakcji. Przykład:Zła praktyka używania GOTO programu SQL Server do obsługi błędów?

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 

Ten artykuł powstał prawie 10 lat temu i słyszałem, że używanie GOTO zazwyczaj jest złym pomysłem. Czy powyższa metoda jest dobra do obsługi błędów w SQL Server? Jeśli nie, czy ktoś może zaproponować lepszą alternatywę?

+0

Sprawdziłeś ten [Odpowiedź] (http://stackoverflow.com/a/ 11153012/1451723)? – Pankaj

Odpowiedz

15

należy używać Try/Catch w 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

Musisz włączyć SET XACT_ABORT ON w 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