我有一个OLE DB命令,最初包含一个简单的三行更新:
更新raw_CommissionPaid设置PolicyNumber =?其中PolicyNumber =?
这个工作正常,完全符合预期,一切都很好。
我最近决定,这有可能出错并造成很大的破坏所以我决定将它全部放在一个事务中,监视受影响的行并回滚如果它改变超出我的预期,所以我将更新更改为:
BEGIN TRY BEGIN TRAN UpdateCommissionsPaidPolNo
更新raw_CommissionPaid设置PolicyNumber =?其中PolicyNumber =?
IF @@ ROWCOUNT<> 1 RAISERROR('行数<> 1',11,1)
COMMIT TRAN END TRY BEGIN CATCH ROLLBACK TRAN UpdateCommissionsPaidPolNo
PRINT 'UpdateCommissionsPaidPolicyNumber script failed' SELECT ERROR_MESSAGE() as ErrorMessage END CATCH
然而,这给了我通常给出的“语法错误或一般错误”消息。我记得以前的一个问题,如果它们被嵌入到其他SQL中,有时它不能将参数映射到?,我认为这可能是问题,所以改成它只是因为:
声明@FNumber varchar(20)声明@LNumber varchar(20)
设置@FNumber =?设置@LNumber =?
BEGIN TRY BEGIN TRAN UpdateCommissionsPaidPolNo
更新raw_CommissionPaid设置PolicyNumber = @FNumber在哪里 PolicyNumber = @LNumber
IF @@ ROWCOUNT<> 1 RAISERROR('行数<> 1',11,1)
COMMIT TRAN END TRY BEGIN CATCH ROLLBACK TRAN UpdateCommissionsPaidPolNo
PRINT 'UpdateCommissionsPaidPolicyNumber script failed' SELECT ERROR_MESSAGE() as ErrorMessage END CATCH
但是我仍然得到:
语法错误,权限违规或其他非特定错误
我意识到这可能是因为打印或错误消息的返回,但删除它们并没有改变任何东西,它仍然失败
我确定sql是有效的,因为我在SQL server management studio中测试过它。
有人面对这个吗?是否有一个设置应该改变以允许这种改变?
提前致谢
答案 0 :(得分:0)
在阅读This site之后,我了解到,如果我将数据流任务TransactionOption属性设置为支持,那么如果它失败,它应该将故障部分自行回滚。
有了这些知识,我认为我唯一需要做的就是让它意识到更新的多行计为错误。所以把它改成这样:
更新raw_CommissionPaid设置PolicyNumber =?其中PolicyNumber =?
IF @@ ROWCOUNT<> 1 RAISERROR('行数<> 1',11,1)
应该让它自行回滚。