catch块回滚中的多个IF语句

时间:2015-07-13 01:58:30

标签: sql stored-procedures transactions try-catch

我需要一些帮助!

我有一个带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

2 个答案:

答案 0 :(得分:0)

仅当INSERT有异常时,此功能才有效,在您的查询中有两种可能的情况可以引发异常,否则会CATCH 从不

  1. PRQID上有主键,NEWID()生成重复值(不太可能发生)
  2. 您在PRQCommand或PRQCDSRNO上有唯一索引,并且您为表中已存在的非空值提供
  3. 更好的方法是在插入之前进行变量检查,然后在没有任何条件的情况下回滚。

答案 1 :(得分:0)

试试这个

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