【问题标题】:SQL Server .NET SqlBulkCopy class keep running after exceptionSQL Server .NET SqlBulkCopy 类在异常后继续运行
【发布时间】:2011-05-06 17:16:59
【问题描述】:

我正在使用 SqlBulkCopy 插入大量数据。数据源可能有一些重复的行。在目标表中,我有一个唯一性索引。

当出现第一个重复行时,SqlBulkCopy 会抛出异常并回滚内部事务。我希望它忽略异常并继续插入。 (仅当例外是针对重复行时)。

关于这个问题有一些疑问,但他们都在寻找报告重复的行,我只是不关心他们。

【问题讨论】:

  • 好的。所以实际上没有办法在不影响其性能的情况下保持 SqlBulkCopy 运行。我应该结束这个问题吗?

标签: .net sql-server exception-handling bulkinsert sqlbulkcopy


【解决方案1】:

在进行批量插入之前解决问题。批量插入专门定义为不处理此类内容。为此,它将 SQL Server 置于某种更快的批量插入模式......但有局限性。必须在插入之前处理所有密钥违规。

我想要做的是插入临时表(允许双打),然后合并到主表中(使用 MERGE 命令)。

【讨论】:

  • 我正在评估这种可能性。但我使用 SqlBulkCopy 的原因是因为真正大量的数据使我有必要尽量减少插入时间。这样做几乎可以翻倍。
  • 但是你必须在批量复制的范围内工作。将数据加载到临时临时表中,就像几乎所有 ETL 解决方案一样。在那里擦洗它,然后将它合并到最终表中。
【解决方案2】:

这是与 SqlBulkCopy 的权衡之一 - 当我知道我有干净的数据时,我会使用它。如果您需要能够在这种没有干净数据的情况下很好地处理错误,那么其他方法“更好”(尽管这是性能的权衡)。

继您的另一个问题之后,SqlDataAdapter 方法将为您提供这种能力,因为您可以设置一个 ContinueOnError 属性,该属性将允许在发生此类错误时继续处理 - 非常方便。当我需要处理来自 .NET 的不太干净/可能有问题的数据时,我会使用这种方法。但正如我之前提到的,您会看到性能成本。

如果您想要绝对的性能,并满足您最初的保持分离的要求,那么您应该在加载到数据库之前对数据进行重复数据删除。或者使用 TomTom 建议的方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2016-08-04
    • 2011-12-09
    • 1970-01-01
    • 2011-03-22
    • 2021-06-20
    相关资源
    最近更新 更多