将.csv文件导入Microsoft SQL Server 2008 R2的推荐方法?

Con*_*ngo 11 sql sql-server-2008

您建议将.csv文件导入Microsoft SQL Server 2008 R2的方法是什么?

我想要一些快速的东西,因为我有一个包含大量.csv文件的目录(500个.csv文件分布在500个.csv文件中).

我在Win 7 x64上使用SQL Server 2008 R2.

更新:解决方案

这是我如何解决问题的结局:

  1. 我放弃了尝试使用LINQ to Entities来完成这项工作.它可以工作 - 但它不支持批量插入,所以它大约慢20倍.也许LINQ to Entities的下一个版本将支持这一点.
  2. 在这个线程上给出了建议,使用了批量插入.
  3. 我创建了一个使用批量插入的T-SQL存储过程.数据进入临时表,进行规范化,然后复制到目标表中.
  4. 我使用LINQ to Entities框架将存储过程映射到C#(www.learnvisualstudio.net上有一个显示如何执行此操作的视频).
  5. 我编写了所有代码来循环遍历C#中的文件等.
  6. 这种方法消除了最大的瓶颈,即从驱动器读取大量数据并将其插入数据库.

为什么这种方法在读取.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秒暂停加速.

Jas*_*son 7

在T-SQL脚本中使用BULK INSERT似乎是一个很好的解决方案.

http://blog.sqlauthority.com/2008/02/06/sql-server-import-csv-file-into-sql-server-using-bulk-insert-load-comma-delimited-file-into-sql-服务器/

您可以使用xp_cmdshell和dir命令(稍微清理)获取目录中的文件列表.在过去,我尝试使用sp_OAMethod和VBScript函数执行类似的操作,并且必须使用dir方法,因为我无法使用FSO对象获取文件列表.

http://www.sqlusa.com/bestpractices2008/list-files-in-directory/