我可以在事务中运行动态SQL和回滚使用EXEC:

exec('SELECT * FROM TableA; SELECT * FROM TableB;');

将这个交易中的,并使用@@ ERROR exec语句后做回滚。

例如。代码

BEGIN TRANSACTION

   exec('SELECT * FROM TableA; SELECT * FROM TableB;');

   IF @@ERROR != 0
     BEGIN
       ROLLBACK TRANSACTION
       RETURN
     END
   ELSE
     COMMIT TRANSACTION

如果有n个动态SQL语句和在正发生错误/ 2将所述第一1到((N / 2) - 1)语句被回滚


绕第一答案问题

@@错误不会最有可能拾取错误 这意味着它可能不会拿起错误,这意味着交易可能会犯?这违背了目的

TRY在SQL Server / CATCH 2005+ 是的,我使用SQL Server 2005,但之前没有使用过尝试捕捉 会做下面这样的伎俩

BEGIN TRANSACTION 
   BEGIN TRY 
      exec('SELECT * FROM TableA; SELECT * FROM TableB;'); 
      COMMIT TRANSACTION 
   END TRY 
   BEGIN CATCH 
      ROLLBACK TRANSACTION 
   END CATCH 

OR我看着一些例子的净

BEGIN TRY --Start the Try Block..
 BEGIN TRANSACTION -- Start the transaction..
  exec('SELECT * FROM TableA; SELECT * FROM TableB;');
 COMMIT TRAN -- Transaction Success!
END TRY
BEGIN CATCH
  IF @@TRANCOUNT > 0
      ROLLBACK TRAN --RollBack in case of Error
  RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), 1)
END CATCH
有帮助吗?

解决方案

是。所述TXNs属于当前会话/连接和动态SQL使用相同的上下文。

然而,@@ ERROR不会最有可能拿起错误:状态有问题的语句之后立即进行检查。我会用try / catch语句,假设SQL Server 2005的+

编辑:TRY / CATCH应该工作确定

其他提示

不要把我们对它的词,试图捕捉将工作,测试它自己。由于这是动态sql最容易做的事情是让第一条语句正确的(当然它mneeds到豆更新,插入或删除,或者没有必要atransaction),然后做出深思熟虑的语法错误在第二statment。然后测试该更新插入或在第一statment删除经历。

我也想指出的是,动态SQL的规则是一个贫穷的做法。这是否真的需要是动态的?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top