我可以在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工作要正常。 |
|
|
|
|
|