如何将20个100mb CSV文件批量插入SQL Server

时间:2011-12-20 19:18:24

标签: c# sql sql-server ssis

我有大约20个.csv文件,每个文件大约100-200mb。

它们每个都有大约100列。

每个文件的90%列是相同的;但是,有些文件有更多列,有些文件列数更少。

我需要将所有这些文件导入到sql server 2008数据库的一个表中。

如果该字段不存在,我需要创建它。

问题:此导入的进程应该是什么?如何更有效,快速地将所有这些文件导入数据库中的一个表中,并确保如果某个字段不存在,那么它是否已创建?另请注意,同一字段可能位于其他位置。例如,CAR可以在一个csv中的字段 AB 中,而在另一个csv文件中相同的字段名称(CAR)可以是 AC 。解决方案可以是SQL或C#,也可以是两者。

8 个答案:

答案 0 :(得分:3)

我建议您查看SQL Server附带的BCP程序,以帮助完成这样的工作:

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

有“格式文件”,允许您指定哪些CSV列转到哪些SQL列。

如果您更倾向于使用C#,请查看SqlBulkCopy类:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx

另请参阅此SO线程,还有关于从CSV文件导入SQL Server的信息:

SQL Bulk import from CSV

答案 1 :(得分:3)

您可以选择多个选项 1.使用DTS包 2.尝试生成一个统一的CSV文件,使db表与其列同步并批量插入 3.批量将每个文件插入到自己的表中,然后将表合并到目标表中。

答案 2 :(得分:1)

我建议编写一个小的c#应用程序,它读取每个CSV文件头并存储所需列的字典,并输出'create table'语句或直接在数据库上运行create table操作。然后,您可以使用Sql Management Studio使用导入例程单独加载20个文件。

答案 3 :(得分:1)

在System.Data.SqlClient

中使用SqlBulkCopy类

它有助于批量数据传输。只抓住它不能使用DataTime DB列

答案 4 :(得分:1)

你有几种可能性。

  • 如果您可以使用SSIS,则可以使用SSIS。
  • 在Sql Server中,您可以使用SqlBulkCopy批量插入临时表,您将在其中插入整个.csv文件 然后使用其中可能包含MERGE语句的存储过程 将每一行放在它所属的位置,如果不存在,则创建一个新行 存在。
  • 您可以使用C#代码读取文件并使用SqlBulkInsert或EntityDataReader
  • 编写它们

答案 5 :(得分:1)

不是一个答案而是更多的方向,但我走了。我这样做的方法是首先枚举CSV文件和数据库中的列名,然后确保CSV中的列名都存在于目的地中。

验证和/或创建所有列后,即可进行批量插入。假设您没有同时发生多次导入,您可以在开始导入时缓存数据库中的列名,因为它们不应该更改。

如果您同时运行多个导入,那么您需要确保在导入期间有完整的表锁定,因为竞争条件可能会出现。

我为SQL DB做了很多自动导入,而且我还没有看到你提出的问题,因为假设要求人们知道进入数据库的数据。提前知道列通常是非常糟糕的事情,但听起来你有一个例外规则。

答案 6 :(得分:1)

自己动手。

保留(或创建)数据库中目标表的列的运行时表示。在导入每个文件之前,请检查列是否已存在。如果没有,请运行相应的ALTER语句。然后导入文件。

实际的导入过程可以并且可能应该由BCP或您提供的任何批量协议来完成。由于源数据和目标仅在逻辑上而非物理上对齐,因此您必须进行一些奇特的kajiggering。所以你需要BCP格式的文件。

答案 7 :(得分:0)

对于这些数据卷,您应该使用ETL。 See this tutorial

ETL专为大量数据操作而设计