0

我有一个 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 中对其进行了测试。

有人遇到过这个吗?是否有我应该更改的设置以允许这种更改?

提前致谢

4

1 回答 1

0

阅读此站点后,我了解到,如果我将数据流任务 TransactionOption 属性设置为受支持,那么如果它失败,它应该会自行回滚失败的部分。

有了这些知识,我想我唯一需要做的就是让它意识到正在更新的多行被视为错误。所以把它改成这样:

更新 raw_CommissionPaid 设置 PolicyNumber = ? 其中 PolicyNumber = ?

IF @@ROWCOUNT <> 1 RAISERROR('行数 <> 1', 11, 1)

应该让它自己回滚。

于 2013-02-07T10:48:29.437 回答