sql - RETURN 在带有 TRY-CATCH block 的事务内

标签 sql sql-server sql-server-2008 tsql

我有以下代码,作为一个通用示例,我想知道如果事务以 RETURN 退出,则事务是否保持打开状态。

BEGIN TRANSACTION
    BEGIN TRY
        IF NOT EXISTS(SELECT 1 FROM dbo.tblProducts WHERE intProductID = @intProductID)
            BEGIN
                SELECT 'Product does not exists' AS strMessage
                RETURN
            END

        UPDATE dbo.tblProducts SET
            curPrice = 10
        WHERE
            intProductID = @intProductID

        SELECT 'Success' AS strMessage

    END TRY 

    BEGIN CATCH
        SELECT ERROR_MESSAGE() AS strMessage
        IF @@TRANCOUNT > 0
            ROLLBACK TRANSACTION
    END CATCH

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION

最佳答案

应该像下面这样

BEGIN TRY
    SET NOCOUNT ON
    SET XACT_ABORT ON
    BEGIN TRANSACTION
        IF NOT EXISTS(SELECT 1 FROM dbo.tblProducts 
                          WHERE intProductID = @intProductID)
        BEGIN
            SELECT 'Product does not exists' AS strMessage
            Rollback TRan
            RETURN
        END

        UPDATE dbo.tblProducts SET
        curPrice = 10
        WHERE
        intProductID = @intProductID

        SELECT 'Success' AS strMessage
    COMMIT TRAN
END TRY 

BEGIN CATCH
    SELECT ERROR_MESSAGE() AS strMessage
    ROLLBACK TRANSACTION
END CATCH

关于sql - RETURN 在带有 TRY-CATCH block 的事务内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12022387/

相关文章:

sql - 在 SQL Server 中复制对象层次结构的最佳方法是什么

SQL Server : row present in one query, 在另一个中丢失

html - sql中如何获取奇数节点和偶数节点的值

sql - 为了更新而更新?

sql - 将 ARRAY_AGG() 与输入中的所有空值一起使用

java - "Not supported for DML operations"使用简单的 UPDATE 查询

sql - 如何为 SQL 中的列组合提供唯一约束,而不考虑 Order

sql - 估计的子树成本大幅下降,糟糕的优化

sql-server - 使用 SQLCMD 执行发布脚本不返回

sql - 左连接选择表 1 中的所有记录和表 2 的单个(可选)记录