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

如果查询完成但有错误,是否需要回滚?

史朗
2023-03-14
问题内容

我有这样的查询:

use DataIncremental
go
DECLARE @row_terminator CHAR;
SET @row_terminator = CHAR(10); -- or char(10)

BEGIN TRAN tran2


DECLARE @stmt NVARCHAR(2000);
SET @stmt = '
  BULK INSERT accn_adjustments
   FROM ''C:\Users\agordon\Desktop\incrementaljan2012\accn_adjustments_201112302112.txt''
   WITH 
      (
        firstrow=2,
FIELDTERMINATOR = ''|''  ,
ROWS_PER_BATCH=10000
   ,ROWTERMINATOR='''+@row_terminator+'''
   )'
exec sp_executesql @stmt;
SET @stmt = '
  BULK INSERT accn_adjustments
   FROM ''C:\Users\agordon\Desktop\incrementaljan2012\accn_adjustments_201112312112.txt''
   WITH 
      (
        firstrow=2,
FIELDTERMINATOR = ''|''  ,
ROWS_PER_BATCH=10000
   ,ROWTERMINATOR='''+@row_terminator+'''
   )'
exec sp_executesql @stmt;
SET @stmt = '
  BULK INSERT accn_adjustments
   FROM ''C:\Users\agordon\Desktop\incrementaljan2012\accn_adjustments_201201022101.txt''
   WITH 
      (
        firstrow=2,
FIELDTERMINATOR = ''|''  ,
ROWS_PER_BATCH=10000
   ,ROWTERMINATOR='''+@row_terminator+'''
   )'
exec sp_executesql @stmt;
SET @stmt = '
  BULK INSERT accn_adjustments
   FROM ''C:\Users\agordon\Desktop\incrementaljan2012\accn_adjustments_201201032101.txt''
   WITH 
      (
        firstrow=2,
FIELDTERMINATOR = ''|''  ,
ROWS_PER_BATCH=10000
   ,ROWTERMINATOR='''+@row_terminator+'''
   )'
exec sp_executesql @stmt;

begin tran tran2这样做的原因是为了确保如果有错误,我可以做一个rollback

我运行了代码,得到的消息是 "query completed with errors"

SSMS并未rows were inserted像平常那样声明某些内容。

当我尝试执行a时rollback tran tran2,它表示该交易从未开始

所以我的问题是, 是否 已提交到数据库?

如果不是,那么为什么它只说“由于错误而导致查询未完成”呢?


问题答案:

描述

从SQL Server 2005开始,您可以使用以下命令进行错误处理: TRY CATCH

TRY … CATCH(Transact-SQL) 为Transact-SQL实现错误处理,类似于Microsoft Visual
C#和Microsoft Visual C ++语言中的异常处理。一组Transact-
SQL语句可以包含在TRY块中。如果TRY块中发生错误,则控制权将传递给CATCH块中包含的另一组语句。

样本

BEGIN TRY
    BEGIN TRANSACTION

     -- do something

    COMMIT TRAN -- Transaction successfull, commit!
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRAN --RollBack if error occured
END CATCH

更多信息

  • Microsoft TechNet-TRY … CATCH(Transact-SQL)


 类似资料:
  • 问题内容: 我有此查询,如果返回成功,则我要处理另一个函数,否则请不要处理该函数。 这是用于运行查询的代码 我想这就像… 问题答案: 这是您可以测试的最简单的方法

  • 当我知道observable在组件/类超出作用域之前肯定会完成(使用或通知)时,我还需要取消订阅它以防止内存泄漏吗?换句话说,是否自动完成/错误的可观察清理,这样我就不用担心了?

  • 问题内容: 更新: 只是在更明显的地方提到它。当我将IN更改为=时,查询执行时间从180缩短为0.00008秒。速度差可笑。 此SQL查询需要180秒才能完成!那怎么可能?有没有一种方法可以优化它更快? 每个表中只有大约5000行,因此它应该不会太慢。 问题答案: (发布我的评论作为答案,显然确实有所作为!) 如果将更改为, 有什么区别? 如果有人想进一步调查,我刚刚进行了测试,发现它很容易复制。

  • 问题内容: 我正在使用自动提交功能连接到SQL Server。如果一切成功,我称之为提交。否则,我就退出。我是否需要显式调用回滚,还是在不提交就关闭连接时自动回滚? 如果很重要,我将从SAS的proc sql内部执行SQL命令。 更新: 如果未调用回滚,则SAS可能会在proc sql块的末尾自动调用commit。因此,在这种情况下,回滚将不仅仅是一个好习惯;这将是必要的。 最终更新: 我们最终切

  • 我正在制作一些lambda来从dynamoDB表中获取数据。 DynamoDB表具有 复合主键 'setId'作为分区键(范围键)(我用这个词'set'作为名词,就像'group'一样) 'id'作为排序键(散列键) 如果我理解正确, 我可以使用setId来查询,因为DynamoDb通过分区键进行集合。 所以我尝试了这个参数。 但它返回错误 Q. 获取集合是否需要排序键? 提前谢谢! 仅供参考)我

  • 问题内容: 在css3动画的情况下,有什么方法可以实现回调函数?如果使用Javascript动画,则可能会在CSS3中找到实现它的方法,但找不到任何方法。 我可以看到的一种方法是在动画持续时间之后执行回调,但是并不能确保始终在动画结束后立即调用它。这将取决于浏览器UI队列。我想要一个更强大的方法。有什么线索吗? 问题答案: 就在这里。回调是一个事件,因此您必须添加事件侦听器才能捕获它。这是jQue