2015-07-13 85 views
1

我需要一些帮助大声笑!我有一个带有try/catch块的存储过程。所以它工作正常,但是当我尝试通过放入应该碰到catch块的值进行测试时,它似乎并没有这样做。我的catch块有没有错,它不会回滚事务?就像坏数据被放入数据库一样,即使它不应该。我究竟做错了什么??先谢谢你!多个IF语句在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 

回答

0

渔获只能如果INSERT有例外,在查询中有2个可能的情况,以提高例外,否则CATCHNEVER到达。

  1. 您对PRQID和NEWID()主键生成一个重复的值(这是不可能发生的)
  2. 您对PRQCommand或PRQCDSRNO唯一索引,并且您提供非空值,它已经存在在表

更好的方法是将变量检查插入之前,然后回滚没有任何条件。

+0

哦,你说的对!我忘了尝试/捕捉如何工作的基础知识!谢谢。 –

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 
+0

我会试试这个。谢谢! –