如何将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#或两者。
您可以选择多个选项 1.使用DTS包 2.尝试产生一个统一的CSV文件,让db表在其列,并批量同步插入 3.批量插入每一个文件它自己的表,然后将这些表合并到目标表中。
我爱你的建议#3。你能告诉我如何结合三张桌子? – 2011-12-20 19:28:48
当然 - 手动 – 2011-12-20 19:30:54
我也喜欢你的#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:
我建议写一个小的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做了大量的自动导入操作,而且我从未见过你问过的内容,因为假定需要知道进入数据库的数据。提前不知道列通常是一件非常糟糕的事情,但它听起来像是对规则有例外。
我在财务上见过这个确切的例子。我并不感到惊讶。但是,是的,这很烦人/尴尬。 – 2011-12-20 19:33:12
对于那些数据卷,您应该使用ETL。 See this tutorial。
ETL设计用于大量的数据处理
很高兴知道为什么downvote ......快速评论可以帮助;) – Romias 2011-12-20 19:34:05
滚动你自己的。
保留(或创建)数据库中目标表的列的运行时表示。在导入每个文件之前,请检查列是否已经存在。如果没有,请运行适当的ALTER语句。然后导入该文件。
实际的导入过程可以也可能应该由BCP或任何您可用的批量协议完成。由于源数据和目的地仅在逻辑上对齐,而不是物理上对齐,所以您将不得不做一些奇特的加逗号。所以你需要BCP格式的文件。
使用SSIS包。 – Maess 2011-12-20 19:20:56
这是一件持续的事情吗?或一次导入? – 2011-12-20 19:22:52
@john这将是一次 – 2011-12-20 19:28:16