我有一个大约1,000,000行固定宽度数据的文件。
我可以阅读它,解析它,做所有这些。
我不知道的是以编程方式将其放入SQL Server数据库的最佳方法。我需要通过T-SQL或Delphi或C#来实现(换句话说,命令行解决方案不是我需要的......)
我知道BULK INSERT
,但这似乎仅适用于CSV?
我应该从我的固定宽度数据和BULK INSERT
创建一个CSV文件吗?
“最快”是指“SQL Server中处理时间最少”。
我希望自动执行此操作,以便“职员”轻松选择输入文件并按下按钮以实现此目的。
将大量固定宽度记录放入SQL Server表的最佳方法是什么?
答案 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个失败,然后逐个做。
我在这里写了一个例子:
答案 3 :(得分:1)
你有很多选择,但最快取决于你的意思。最快完成一次,我现在就做吧? SQL管理工作室中有一个向导。每月最快,学习曲线最小。 SQL Managment工作室中有DTS向导。每晚最低的SQL引擎周期? SSIS http://en.wikipedia.org/wiki/SQL_Server_Integration_Services
答案 4 :(得分:1)
bulk insert
或bcp
是执行此操作的最快方法,因为它是未记录的操作。根据我的经验,您可以轻松地每秒插入10k行。
要批量插入固定宽度数据,您需要创建批量复制格式文件: