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

问题描述:

我有大约20个.csv文件,每个文件大约100-200mb。如何将20个100mb的CSV文件批量插入到SQL Server中

它们每个都有大约100列。

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

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

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

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

+3

使用SSIS包。 – Maess 2011-12-20 19:20:56

+0

这是一件持续的事情吗?或一次导入? – 2011-12-20 19:22:52

+0

@john这将是一次 – 2011-12-20 19:28:16

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

+0

我爱你的建议#3。你能告诉我如何结合三张桌子? – 2011-12-20 19:28:48

+0

当然 - 手动 – 2011-12-20 19:30:54

+1

我也喜欢你的#3 +1 – Bengie 2011-12-20 19:31:22

我会建议看附带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

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

使用SqlBulkCopy类在System.Data.SqlClient的

它有利于批量数据传输。只捕获它不会与DataTime数据库列

有几种可能性,你在这里。

  • 如果可以使用SSIS,则可以使用SSIS。
  • 在SQL Server中,您可以使用SqlBulkCopy的批量插入到一个临时表中,您将插入整个.csv文件 ,然后在它使用存储过程有可能MERGE声明 放置的每一行,它属于或创建新的,如果它不存在 。
  • 您可以使用C#代码来读取文件,并使用SqlBulkInsert或EntityDataReader

答案的少,更多的是方向的写出来,但在这里,我走了。我会这样做的方式是首先枚举CSV文件和数据库中的列名,然后确保CSV中的所有列都存在于目标中。

一旦你验证和/或创建了所有的列,那么你可以做你的批量插入。假设您没有同时进行多个导入,您可以在开始导入时从数据库缓存列名,因为它们不应该更改。

如果您将有多个导入同时运行,那么您需要确保在导入过程中有一个完整的表锁,因为竞态条件可能会显示。

我为SQL DB做了大量的自动导入操作,而且我从未见过你问过的内容,因为假定需要知道进入数据库的数据。提前不知道列通常是一件非常糟糕的事情,但它听起来像是对规则有例外。

+1

我在财务上见过这个确切的例子。我并不感到惊讶。但是,是的,这很烦人/尴尬。 – 2011-12-20 19:33:12

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

ETL设计用于大量的数据处理

+0

很高兴知道为什么downvote ......快速评论可以帮助;) – Romias 2011-12-20 19:34:05

滚动你自己的。

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

实际的导入过程可以也可能应该由BCP或任何您可用的批量协议完成。由于源数据和目的地仅在逻辑上对齐,而不是物理上对齐,所以您将不得不做一些奇特的加逗号。所以你需要BCP格式的文件。