将1,000,000行固定宽度文本放入SQL Server数据库的最快方法是什么?

时间:2013-05-01 15:10:56

标签: sql sql-server data-migration fixed-width

我有一个大约1,000,000行固定宽度数据的文件。

我可以阅读它,解析它,做所有这些。

我不知道的是以编程方式将其放入SQL Server数据库的最佳方法。我需要通过T-SQL或Delphi或C#来实现(换句话说,命令行解决方案不是我需要的......)

我知道BULK INSERT,但这似乎仅适用于CSV?

我应该从我的固定宽度数据和BULK INSERT创建一个CSV文件吗?

“最快”是指“SQL Server中处理时间最少”。

我希望自动执行此操作,以便“职员”轻松选择输入文件并按下按钮以实现此目的。

将大量固定宽度记录放入SQL Server表的最佳方法是什么?

5 个答案:

答案 0 :(得分:8)

我认为“最快”是指运行时间:

从编译代码执行此操作的最快方法是使用SQLBulkCopy methods将数据直接插入目标表。您必须编写自己的代码才能打开并读取源文件,然后根据其固定宽度偏移将其拆分到相应的列中,然后将其提供给SQLBulkCopy。 (我想我有一个这方面的例子,如果你想走这条路)

从T-SQL执行此操作的最快方法是将shell转出到DOS,然后使用BCP将文件直接加载到目标表中。您需要制作一个BCP格式文件,用于定义此appraoch的固定宽度列。

使用任何CLI从T-SQL(没有)执行此操作的最快方法是使用BULK INSERT将文件加载到只有一列DATA VARCHAR(MAX)的临时表中(如果文件中包含unicode数据,则生成NVARCHAR(MAX)。然后执行您编写的SQL查询以将DATA列拆分为其固定宽度字段,然后将它们插入到目标文件中。这应该只采用一个INSERT语句,尽管它可能很大。 (我在某处也有这样的例子)

您的另一个“最快”选项是使用SSIS包或SQL Server导入向导(它们实际上是相同的,在引擎盖下)。 SSIS有一个非常陡峭的学习曲线,所以如果你期望在未来对其他案例做这个(或类似的事情),它真的是值得的。

另一方面,向导很容易作为一次性使用。向导也可以制作一个可调度的工作,所以如果你需要每晚重复同样的事情,这肯定是最简单的,只要它实际上适用于你的案例/文件/数据。如果没有那么它可能是一个真正令人头痛的问题,但固定宽度数据应该不是问题。

所有这些选项中最快的一直是(也可能永远是)BCP。

答案 1 :(得分:5)

我个人会用SSIS包来做这件事。它具有处理固定宽度定义的灵活性。

如果这是一次加载,请使用向导导入数据。如果不。自己创建一个包,然后安排它定期运行。

答案 2 :(得分:1)

我所做的是加载连接到导入文件的IDataReader。

然后我循环遍历IDataReader,验证每一行,有时按下每一行中的数据,然后将其推入Xml(或数据集并背驮ds.GetXml()方法)。

然后每隔这么多行(每1000个让我们说),我把它们推到一个可以处理xml输入的存储过程。

如果单行验证失败,我会将其记录以供日后使用。 (如果我有1,000,000行,并且可以错过一行,所以我正确导入了999,999行,我稍后会处理错误的条目。)

如果我的批量插入xml失败(其中包含1,000行),我会记录整个xml。 你可以查看一个失败的集合(1000),然后逐个导入,然后以我猜的方式记录那些坏的。 Aka,一次做1000个,直到1000个失败,然后逐个做。

我在这里写了一个例子:

http://granadacoder.wordpress.com/2009/01/27/bulk-insert-example-using-an-idatareader-to-strong-dataset-to-sql-server-xml/

答案 3 :(得分:1)

你有很多选择,但最快取决于你的意思。最快完成一次,我现在就做吧? SQL管理工作室中有一个向导。每月最快,学习曲线最小。 SQL Managment工作室中有DTS向导。每晚最低的SQL引擎周期? SSIS http://en.wikipedia.org/wiki/SQL_Server_Integration_Services

答案 4 :(得分:1)

bulk insertbcp是执行此操作的最快方法,因为它是未记录的操作。根据我的经验,您可以轻松地每秒插入10k行。

要批量插入固定宽度数据,您需要创建批量复制格式文件:

http://msdn.microsoft.com/en-us/library/ms178129.aspx