当前位置: 首页 > 面试题库 >

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

谭正谊
2023-03-14
问题内容

我可以在事务中运行动态sql并使用EXEC进行回滚:

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

将其放入事务中,并在exec语句后使用@@ error进行回滚。

例如。代码

BEGIN 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)条语句

有关第一个答案的问题

@@ Error最有可能不会拾取错误,这意味着它可能不会拾取错误,这意味着事务可能会提交?达不到目的

SQL Server 2005+中的TRY / CATCH是,我正在使用SQL Server 2005,但在尝试以下操作之前没有使用Try Catch

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

或者我在网上看了更多的例子

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

问题答案:

是的。TXN属于当前会话/连接,并且动态SQL使用相同的上下文。

但是,@@ ERROR最有可能不会收到该错误:必须在违规语句之后立即检查状态。我会使用TRY / CATCH,假设使用SQL Server 2005+

编辑:TRY / CATCH应该工作正常。



 类似资料:
  • 我正在使用Apache FOP通过XML和XSL-FO生成PDF。我在生成的PDF中有一个单元格,如果内容溢出,我需要能够滚动它。XSL-FO有一个溢出="滚动"功能,但根据我对该主题的研究,Apache FOP似乎不支持此选项。 例如,这是一个大型CAD公司使用的PDF中的可滚动区域,我需要复制: 有没有办法在Apache FOP中启用此功能?是否可以在源代码中启用它(我还没有找到这样做的方法)

  • 我在使用PIVOT SQL脚本时遇到了一个“小”问题。我目前的解决方案基于类似的问题 动态枢轴 . 我已经写好了PIVOT脚本,基本上没问题。然而,我的情况是这样的,脚本输出类似这样的内容,而不是将唯一的条目放在单行上 而我所寻找的结果应该是这样的 这是脚本 我将不胜感激一些可以帮助我解决这个问题的指示。我在这里做了一个小提琴,由于某种奇怪的原因,它没有输出任何东西,但生成架构的所有代码都在那里

  • 我需要在查询中输入动态json路径,可以吗? 我的尝试: 调用此函数时,我会收到以下错误消息: 味精203,16级,状态2,第2行 Name“SELECT JSON_VALUE”({“glossary”):{“title”:“example glossary”,“GlossDiv”:{“title”:“S”,“GlossList”:{“GlossEntry”:{“ID”:“SGML”,“SortA

  • 问题内容: 说我有一个带有这样的渲染的组件: 其中jewelStyle = 如何使背景颜色动态并随机分配?我试过了 但这会使View的所有实例具有相同的颜色,我希望每个实例都是唯一的。 有小费吗? 问题答案: 我通常按​​照以下方式进行操作: … 每次渲染View时,都会使用与之关联的随机颜色实例化一个新样式对象。当然,这意味着每次重新渲染组件时颜色都会改变,这也许不是您想要的。相反,您可以执行以

  • 在对特定变更集执行update命令后,我将liquibase与oracle数据库一起使用,该变更集的日志插入到DATABASECHANGELOG表中,但是如果我执行rollbackCount命令回滚该变更集,插入的日志将被删除,并且我无法找到已执行并再次回滚的变更的历史记录。

  • 问题内容: 我需要在声明式管道中启动一组动态测试。为了更好的可视化目的,我想为每个测试创建一个阶段。有办法吗? 创建一个我知道的阶段的唯一方法是: 我已经看到了这个示例,但是我没有使用声明性语法。 问题答案: 使用声明性语法比声明性语法更具灵活性的脚本化语法,即使声明性文档和建议性更多。 例如,可以循环创建阶段: