【问题标题】:Bulk insert operations process records without errors批量插入操作过程记录无错误
【发布时间】:2023-03-29 18:57:01
【问题描述】:

据我了解,使用 C# 和 SQL Server 批量插入数据的最佳方法是使用表类型并传入数据表。 我们当前的流程是一次处理/插入一条记录(即使有数千条记录),以便我们能够成功处理有效记录并报告错误。显然这是一个巨大的性能问题。

有没有办法进行批量插入操作,允许插入有效记录而无效记录失败? 如果是这样,您如何找出哪些记录通过,哪些记录失败或导致错误?

【问题讨论】:

  • 这个Article详细讨论这个。
  • 这是一篇非常有趣的文章,它会给我一些关于如何使用它的额外想法,但它是在 2012 年写的。我想知道从那时起是否有任何改变SQL Server 或 .Net 框架。与使用表格类型相比,批量复制仍然是最好的方法吗?

标签: c# sql-server bulkinsert


【解决方案1】:

我认为只有 SSIS 可以做到你所描述的。我过去所做的是使用 SQLXML 将数据批量加载到 SQL Server (https://msdn.microsoft.com/en-us/library/ms171993.aspx)。

基本上我做的是这样的:

  1. 创建与表结构对应的 XML Schema 并添加映射属性(参见此处https://msdn.microsoft.com/en-us/library/ms171721.aspx
  2. 使用 XML Schema 从 C# 创建 XML 文件以对我的数据进行序列化
  3. 由于 XML 批量加载在第一个错误(如 BulkInsert)中失败,我不得不使用 XMLReader 解析 XML 文档(串行以支持大型 XML 文件)并根据架构对其进行验证。这样我就知道哪些元素不符合架构,我可以删除它们并将它们存储在另一个 XML 文件中。
  4. 将固定的 XML 文件批量加载到 SQL Server 表中

所以这里的主要 I/O 包括:有一个读取器流来读取 XML,2 个写入器流来写入有效和无效的 XML 文件,最后批量加载有效的 XML 文件。

顺便说一句,性能很棒(我可以在不到 5 分钟的时间内在笔记本电脑上批量加载 1GB 文件,但这可能因磁盘速度和 CPU 而异)。顺便说一句,内存利用率非常低。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    相关资源
    最近更新 更多