4

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

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

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

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

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

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

我的愿望是自动执行此操作,以便“职员”轻松选择输入文件并按下按钮使其发生。

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

4

5 回答 5

8

我假设“最快”是指运行时:

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

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

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

您的另一个“最快”选项是使用 SSIS 包或 SQL Server 导入向导(它们实际上是同一件事,在引擎盖下)。SSIS 的学习曲线非常陡峭,因此只有在您希望将来也为其他情况这样做(或类似的事情)时才真正值得。

另一方面,向导很容易一次性使用。向导还可以进行可安排的工作,因此如果您需要每晚重复同样的事情,那当然是最简单的,只要它确实适用于您的案例/文件/数据。如果不是这样,那么正确处理它可能会令人头疼,但固定宽度的数据应该不是问题。

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

于 2013-05-01T15:40:35.840 回答
5

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

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

于 2013-05-01T15:25:11.933 回答
1

我要做的是加载一个连接到导入文件的 IDataReader。

然后我遍历 IDataReader,验证每一行,有时对每一行中的数据进行处理,然后将其推送到 Xml(或 DataSet 并搭载 ds.GetXml() 方法)。

然后每隔这么多行(假设每 1,000 行),我将它们推送到可以处理 xml 输入的存储过程。

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

如果我的批量插入 xml 失败(其中有 1,000 行),我会记录整个 xml。您可以检查一个失败的集合(1,000 个)并逐个导入这些集合,然后按照我猜的方式记录坏的集合。Aka,一次做 1,000 个,直到 1,000 个失败,然后一个接一个地做。

我在这里写了一个例子:

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

于 2013-05-01T15:19:06.950 回答
1

您有多种选择,但取决于您所说的最快是什么意思。从我现在开始,最快完成一次?SQL 管理工作室中有一个向导。每月以最短的学习曲线最快地完成它。SQL 管理工作室中有 DTS 向导。每晚执行此操作的最低 SQL 引擎周期?SSIS http://en.wikipedia.org/wiki/SQL_Server_Integration_Services

于 2013-05-01T15:21:03.873 回答
1

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

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

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

于 2013-05-01T16:19:33.073 回答