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

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

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

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

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

我了解BULK INSERT,但这似乎仅适用于 CSV......?

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

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

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

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

最佳答案

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

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

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

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

您的另一个“最快”选项是使用 SSIS 包或 SQL Server 导入向导(它们实际上是相同的东西,在幕后)。 SSIS 的学习曲线相当陡峭,因此只有当您希望将来也为其他情况执行此操作(或类似的操作)时,它才真正值得。

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

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

关于sql - 将 1,000,000 行固定宽度文本导入 SQL Server 数据库的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16320812/

相关文章:

mysql - 用mysql统计第一名分数的个数

c# - 是否可以将 DataTable 传递给 Entity Framework 中的临时 sql 查询?

sql-server - SQL查找字符串中的第一个非数字字符

asp.net - 缓存以便稍后写入 ASP.NET Web 服务中的数据库?

c# - 从代码执行 FluentMigrator 迁移

mysql - 如何迁移 docker 容器中的 MySQL 数据目录?

mysql - 使用除 ID 以外的随机值在 MySQL 中添加新记录

MySQL - 只选择每个外键的最后一条记录

sql-server - 如何在 SQL Server 2008 中将 datetimeoffset 转换为 datetime?

grails db-generate-changelog 错误