2012-06-21 15 views
8

Estaba leyendo sobre el manejo de errores en SQL Server en this article, y sugieren usar el GOTO de SQL Server en ciertas situaciones para deshacer la transacción. Ejemplo:¿Una mala práctica para usar el GOTO de SQL Server para el manejo de errores?

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 

Este artículo fue escrito hace casi 10 años y he oído que por lo general es una mala idea usar GOTO. ¿Es lo anterior un método correcto para el manejo de errores en SQL Server? Si no, ¿alguien puede sugerir una mejor alternativa?

+0

¿Ha comprobado esta [respuesta] (http://stackoverflow.com/a/ 11153012/1451723)? – Pankaj

Respuesta

15

Debería utilizar Try/Catch en 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

Debe incorporar en SET XACT_ABORT ONException 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 
Cuestiones relacionadas