【问题标题】:Bulk Insert Sql Server millions of record批量插入 Sql Server 数百万条记录
【发布时间】:2012-05-30 15:57:01
【问题描述】:

我有一个 Windows 服务应用程序,它接收具有以下格式的数据流

IDX|20120512|075659|00000002|3|AALI                 |Astra Agro Lestari Tbk.                                     |0|ORDI_PREOPEN|12  |00000001550.00|00000001291.67|00001574745000|00001574745000|00500|XDS1BXO1|                                        |00001574745000|›§
IDX|20120512|075659|00000022|3|ALMI                 |Alumindo Light Metal Industry Tbk.                          |0|ORDI        |33  |00000001300.00|00000001300.00|00000308000000|00000308000000|00500|--U3---2|                                        |00000308000000|õÄ

这些数据以数百万行和序列00000002....00198562 出现,我必须根据序列解析并将它们插入到数据库表中。

我的问题是,将这些数据插入我的数据库的最佳方式(最有效)是什么?我尝试使用一种简单的方法来打开 SqlConnection 对象,然后生成一串 SQL 插入脚本,然后使用 SqlCommand 对象执行脚本,但是这种方法花费的时间太长。

我读到我可以使用 Sql BULK INSERT 但它必须从文本文件中读取,这种情况是否可以使用 BULK INSERT? (我以前从未使用过)。

谢谢

更新:我知道 SqlBulkCopy 但它要求我首先拥有 DataTable,这对性能有好处吗?如果可能的话,我想直接从我的数据源插入到 SQL Server,而不必在内存中使用 DataTable。

【问题讨论】:

  • “按顺序插入”是什么意思?为什么插入行的顺序很重要?它们以clustered index 中指定的顺序存储,与插入顺序无关。

标签: c# sql-server windows-services bulkinsert


【解决方案1】:

如果您使用 C# 编写此代码,您可能需要查看 SqlBulkCopy 类。

让您可以使用其他来源的数据高效地批量加载 SQL Server 表。

【讨论】:

  • ;) 令人惊讶的是,人们从不看文档的方式——SqlBUlkCopy 至少要检查一下。注意:编写一个允许 SqlBulkCopy 使用对象枚举作为数据源的转换器很简单(一个小时);)
  • 嗨,马克,感谢您的回答,我已经更新了我的问题。你能对此发表评论吗?谢谢。
【解决方案2】:

首先,下载免费的 LumenWorks.Framework.IO.Csv 库。

其次,使用这样的代码

StreamReader sr = new TextReader(yourStream);
var sbc = new SqlBulkCopy(connectionString);
sbc.WriteToServer(new LumenWorks.Framework.IO.Csv.CsvReader(sr));

是的,就是这么简单。

【讨论】:

  • 我正在寻找一个库,它可以处理带有嵌入引号和换行符的 CSV 字段。这个 CSVReader 非常完美,可以轻松插入 SqlBulkCopy。我现在只需几行代码就可以每分钟加载数百万行。感谢分享。
  • 嗨,如何插入带有检查的值?例如我想检查数据库中是否存在记录,如果存在我想追加到其他表
  • @NitinSawant 它不会再被 bulk 插入了。而是常规的一对一。
  • @NitinSawant 您需要更改处理思路-使用批量插入推入表A,然后您可以在另一个表上执行连接以决定将其放置在哪里;数据库应该用于基于集合的操作,它们在基于行上的表现真的很差
【解决方案3】:

您可以使用 SSIS“Sql Server 集成服务”将数据从源数据流转换为目标数据流。 源可以是文本文件,目标可以是 SQL Server 表。您的转换以批量插入模式执行。

【讨论】:

  • 为什么每个单词都大写?!
猜你喜欢
  • 1970-01-01
  • 2016-04-12
  • 2015-07-14
  • 2023-01-31
  • 1970-01-01
  • 2011-02-15
  • 2020-10-31
  • 1970-01-01
  • 2016-04-20
相关资源
最近更新 更多