使用SQL Server的GOTO进行错误处理的不良做法?

Abe*_*ler 8 sql sql-server error-handling goto

我在读有关错误在SQL Server处理这篇文章,他们建议使用SQL Server的GOTO在某些情况下回滚事务.例:

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
Run Code Online (Sandbox Code Playgroud)

这篇文章是在大约10年前写的,我听说使用GOTO通常是个坏主意.以上是SQL Server中错误处理的正确方法吗?如果没有,有人可以提出更好的选择吗?

Sli*_*SFT 16

您应该在SQL 2005+中使用Try/Catch

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
Run Code Online (Sandbox Code Playgroud)


Pan*_*kaj 5

您必须包含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
Run Code Online (Sandbox Code Playgroud)