我有一个运行一些命令的存储过程.我不希望这些命令包装在存储过程的事务中.如果第4个命令失败,我希望第1个,第2个和第3个命令保持不回滚.
是否可以以不会将所有存储过程作为一个大事务执行的方式编写存储过程?
解决方法
我认为这里可能存在一些关于批次与交易的混淆.
事务是一个或多组语句,它们将作为一个单元成功或失败.所有DDL语句本身都在事务中(即如果更新100行但行98引发错误,则不会更新任何行).您也可以使用BEGIN TRANSACTION在事务中包装一系列语句,然后使用COMMIT或ROLLBACK.
批处理是一系列一起执行的语句.存储过程是批处理的示例.在存储过程中,如果一个语句失败并且存在错误捕获(通常是TRY / CATCH块),则后续语句将不会执行.
我怀疑你的问题是当发生错误时批处理被取消,因为存储的proc本身或外部作用域(如调用此过程的应用程序或存储过程)都有错误捕获.如果是这种情况,则解决这个问题比较棘手,因为您需要调整处理错误的方式,无论陷阱是什么.