将 .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# 到 SQL 服务器链接将数据缓慢传输到数据库中。
是的,我知道使用 100% 纯 C# 代码来完成这项工作会更好,但最终:
- (a) 对于这个特定问题,与 C# 相比,使用 T-SQL 需要的代码少得多,大约为 1/10,特别是对于对临时表中的数据进行非规范化的逻辑。这更简单且更易于维护。
- (b) 使用 T-SQL 意味着您可以利用 native 批量插入过程,从而将等待时间从 20 分钟缩短为 30 秒暂停。
最佳答案
在 T-SQL 脚本中使用 BULK INSERT 似乎是一个很好的解决方案。
您可以使用 xp_cmdshell 和 dir 命令获取目录中的文件列表(进行一些清理)。过去,我尝试使用 sp_OAMethod 和 VBScript 函数执行类似的操作,但不得不使用 dir 方法,因为我无法使用 FSO 对象获取文件列表。
http://www.sqlusa.com/bestpractices2008/list-files-in-directory/
关于sql - 将 .csv 文件导入 Microsoft SQL Server 2008 R2 的推荐方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5011335/