回答

收藏

我可以在SQL Server / TSQL中回滚动态SQL吗

技术问答 技术问答 233 人阅读 | 0 人回复 | 2023-09-14

我可以在事务中运行动态sql并使用EXEC进行回滚:
! ~$ g8 B  Q; f8 Lexec('SELECT * FROM TableA; SELECT * FROM TableB;');把它放在事务中exec语句后使用@@ error进行回滚。
, W  f" S! H$ c9 }9 A) S  s5 U6 {例如。代码
; Y% Z6 ]7 x# h: i1 U5 a6 e* w! ]$ bBEGIN TRANSACTION   exec('SELECT * FROM TableA; SELECT * FROM TableB;   IF @@ERROR != 0     BEGIN       ROLLBACK TRANSACTION       RETURN     END   ELSE     COMMIT TRANSACTION如果存在n条动态sql句子和错误发生在n / 2中,回滚前1-((n / 2)-1)条语句
2 R6 P) C1 i) f. W& d3 y关于第一个答案的问题
* z! m  J" k, R& o@@ Error最有可能不会犯错误,这意味着它可能不会犯错误,这意味着事务可能会提交?达不到目的
0 @% V# h, d. G5 v: q+ ]SQL Server 2005 中的TRY / CATCH是的,我在用SQL Server 2005,但在尝试以下操作之前没有使用Try Catch8 t8 w0 Z; F" i% |8 H
BEGIN TRANSACTION    BEGIN TRY       exec('SELECT * FROM TableA; SELECT * FROM TableB;);COMMIT TRANSACTION    END TRY    BEGIN CATCH       ROLLBACK TRANSACTION    END CATCH或者我在网上看到了更多的例子: u9 Q! S: Z, C! V
BEGIN TRY --Start the Try Block.. BEGIN TRANSACTION -- Start the transaction..  exec('SELECT * FROM TableA; SELECT * FROM TableB;'); COMMIT TRAN -- Transaction Success!END TRYBEGIN CATCH  IF @@TRANCOUNT > 0       ROLLBACK TRAN --RollBack in case of Error  RAISERROR(ERROR_MESSAGE(),ERROR_SEVERITY(),1)END CATCH               
5 K2 g) i1 v: L    解决方案:                                                               
  b( R9 c* a. h  A  I                                                                是的。TXN属于当前会话/连接,动态SQL使用相同的上下文。
  [/ t$ [( T# y7 j+ j% s但是,@@ ERROR最有可能不会收到这个错误:必须在违规句子后立即检查状态。我会用的。TRY / CATCH,假设使用SQL Server 2005 0 y5 b' Y7 z4 p5 }
编辑:TRY / CATCH工作要正常。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则