2012-05-24 108 views
11

我有接收数据流格式如下批量插入SQL服务器数以百万计的记录

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 Windows服务应用程序,我必须分析和将它们按照顺序插入到数据库表中。

我的问题是,将这些数据插入到我的数据库中的最佳方式(最有效)是什么?我试图用一个简单的方法来打开一个SqlConnection对象,然后生成一个SQL插入脚本的字符串,然后使用SqlCommand对象执行脚本,但是这个方法耗时过长。

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

谢谢

更新:我知道SqlBulkCopy的,但它要求我有数据表第一,这是很好的表现?如果可能,我想直接从我的数据源插入到SQL Server,而不必在内存中使用DataTable。

+3

“按照顺序插入”是什么意思?为什么插入行的顺序很重要?无论插入顺序如何,它们都按照[聚簇索引](http://msdn.microsoft.com/zh-cn/library/aa933131.aspx)中指定的顺序存储。 –

回答

22

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

可让您有效地批量加载SQL Server表与其他来源的数据。

+2

;)令人惊讶的是,人们应该永远不会看文档 - SqlBUlkCopy至少可以检查出来。注意:编写一个允许SqlBulkCopy使用枚举对象作为数据源的转换器很简单(一小时);) – TomTom

+0

嗨,Mark,感谢您的回答,我已更新了我的问题。你能评论一下吗?谢谢。 – Arief

+2

请参阅@ TomTom的评论。 – zmbq

0

您可以使用SSIS“SQL Server集成服务”将数据从源数据流转换为远程数据流。 来源可以是文本文件和目标可以是SQL Server表文件。并在批量插入模式下转换执行。

+0

为什么每个单词都大写? – Liam

3

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

其次,使用这样的代码

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

是的,这是真的那么容易。

+1

我正在寻找一个图书馆,处理带有嵌入引号和换行符的CSV字段。这个CSVReader是完美的,并且可以轻松插入到SqlBulkCopy中。现在我只能使用几行代码每分钟加载数百万行。感谢分享。 – Martin

+0

嗨,如何插入值与检查?例如我想检查记录是否存在或不在数据库中,如果存在我想追加到其他表 –

+1

@NitinSawant它不会是* bulk *插入任何更多。但经常一个一个。 –