sql - 使用 SQL Server 的 GOTO 进行错误处理是不好的做法吗?

标签 sql sql-server error-handling goto

我在 this article 中阅读了有关 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

这篇文章是近 10 年前写的,我听说使用 GOTO 通常不是一个好主意。以上是 SQL Server 中错误处理的好方法吗?如果没有,有人可以建议更好的选择吗?

最佳答案

您应该使用Try/Catch在 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

关于sql - 使用 SQL Server 的 GOTO 进行错误处理是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11141814/

相关文章:

java - 不带时区的 PostgreSQL 时间戳与带时区的 java.util.Date 的比较

python - 如何从具有关系的表中检索数据 - 多对多 (SQLAlchemy)?

sql-server - 如何使用 pymsteams (python ms team) 发送 df 变量的结果

mysql - SQL连接不同大小的表以及空值替换

javascript - 如何在允许用户转到下一页之前验证下拉框选项?

java - Hibernate将sql保存到文件

mysql - 用于集成 MSSQL 和 MySql 数据库的 SSIS 包创建

php - 知道为什么我的 'register_shutdown_function'无法捕获 'require'错误吗?

excel - 用于创建新文件夹的数据验证

SQL 数据截断 : Incorrect date value