【发布时间】:2013-12-12 00:31:55
【问题描述】:
您推荐的将 .csv 文件导入 Microsoft SQL Server 2008 R2 的方法是什么?
我想要一些快速的东西,因为我有一个包含大量 .csv 文件的目录(>500MB 分布在 500 个 .csv 文件中)。
我在 Win 7 x64 上使用 SQL Server 2008 R2。
更新:解决方案
这是我最后解决问题的方法:
- 我放弃了尝试使用 LINQ to Entities 来完成这项工作。它可以工作 - 但它不支持批量插入,所以它慢了大约 20 倍。也许下一个版本的 LINQ to Entities 会支持这一点。
- 接受了在此线程上给出的建议,使用了批量插入。
- 我创建了一个使用批量插入的 T-SQL 存储过程。数据进入临时表,经过规范化,然后复制到目标表中。
- 我使用 LINQ to Entities 框架将存储过程映射到 C#(www.learnvisualstudio.net 上有一段视频展示了如何执行此操作)。
- 我用 C# 编写了所有用于循环文件等的代码。
- 这种方法消除了最大的瓶颈,即从驱动器中读取大量数据并将其插入数据库。
这种方法在读取 .csv 文件时速度极快的原因是什么? Microsoft SQL Server 可以使用自己高度优化的例程将文件直接从硬盘直接导入数据库。大多数其他基于 C# 的解决方案需要更多的代码,并且一些(如 LINQ to Entities)最终不得不通过 C#-to-SQL-server 链接将数据缓慢地输送到数据库中。
是的,我知道使用 100% 纯 C# 代码来完成这项工作会更好,但最终:
- (a) 对于这个特定的问题,与 C# 相比,使用 T-SQL 需要 多 少的代码,大约是 1/10,尤其是用于对暂存表中的数据进行非规范化的逻辑。这更简单,更易于维护。
- (b) 使用 T-SQL 意味着您可以利用本机批量插入过程,该过程可以将等待时间从 20 分钟缩短到 30 秒暂停。
【问题讨论】:
-
不错的一个(并且p l u s on e)!感谢您的提示-对我也很有用。只是想知道为什么有一个 100% 的 C# 代码来完成这项工作会很好?对我来说,拥有一个完全没有任何 C# 代码的 100% T-SQL 解决方案真是太好了 :) 我使用 xp_dirtree 来获取我的 CSV 文件列表。见patrickkeisler.com/2012/11/…
标签: sql sql-server-2008