【问题标题】:Multiple IF Statements in catch block rollbackcatch 块回滚中的多个 IF 语句
【发布时间】:2015-07-13 01:58:30
【问题描述】:

我需要一些帮助!

我有一个带有 try/catch 块的存储过程。它工作正常,但是当我尝试通过输入应该命中 catch 块的值进行测试时,它似乎没有这样做。我的 catch 块是否有问题,它没有回滚事务?就像坏数据被放入数据库一样,即使它不应该。我究竟做错了什么??先感谢您!

begin try 
Begin Transaction
Insert Into ProcessingRequestQueue(PRQID,PRQTarget, PRQStatus, PRQCommand, PRQCDSRNO)
Values (newid(),'CARDSIEVER','I',@PRQCommand,@cdsrno)
commit
End Try

Begin Catch 
IF (@cdsrno = 0 and (@cdsrno is null or @cdsrno = ''))

or (@PRQCommand is null or @PRQCommand = '')
rollback


End Catch 
END

【问题讨论】:

    标签: sql stored-procedures transactions try-catch


    【解决方案1】:

    catch 仅在 INSERT 有异常时才有效,在您的查询中有 2 种可能的情况会引发异常,否则 CATCH 永远不会到达。

    1. 您在 PRQID 上有主键,并且 NEWID() 生成重复值(这不太可能发生)
    2. 您在 PRQCommand 或 PRQCDSRNO 上具有唯一索引,并且您为其提供了表中已存在的非空值

    更好的方法是在插入之前先检查变量,然后无条件回滚。

    【讨论】:

    • 天哪,你是对的!我忘记了 try/catch 如何工作的基础知识!谢谢。
    【解决方案2】:

    试试这个

    BEGIN TRANSACTION
     BEGIN TRY 
    INSERT ProcessingRequestQueue(PRQID,PRQTarget, PRQStatus, PRQCommand, PRQCDSRNO)
    Values (newid(),'CARDSIEVER','I',@PRQCommand,@cdsrno)
    IF @cdsrno = 0 OR @cdsrno is null or @cdsrno = '' or @PRQCommand is null or @PRQCommand = ''
    BEGIN<br>
    ROLLBACK TRANSACTION
    END
    BEGIN CATCH
    ROLLBACK TRANSACTION
    END CATCH
    

    【讨论】:

    • 我会试试这个。谢谢!
    猜你喜欢
    • 2021-12-25
    • 1970-01-01
    • 2017-05-15
    • 2015-08-26
    • 2016-03-05
    • 1970-01-01
    • 2023-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多