我有大约20个.csv文件,每个文件大约100-200mb。
它们每个都有大约100列。
每个文件的90%列是相同的;但是,有些文件有更多列,有些文件列数更少。
我需要将所有这些文件导入到sql server 2008数据库的一个表中。
如果该字段不存在,我需要创建它。
问题:此导入的进程应该是什么?如何更有效,快速地将所有这些文件导入数据库中的一个表中,并确保如果某个字段不存在,那么它是否已创建?另请注意,同一字段可能位于其他位置。例如,CAR可以在一个csv中的字段 AB 中,而在另一个csv文件中相同的字段名称(CAR)可以是 AC 。解决方案可以是SQL或C#,也可以是两者。
答案 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的信息:
答案 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)
你有几种可能性。
答案 5 :(得分:1)
不是一个答案而是更多的方向,但我走了。我这样做的方法是首先枚举CSV文件和数据库中的列名,然后确保CSV中的列名都存在于目的地中。
验证和/或创建所有列后,即可进行批量插入。假设您没有同时发生多次导入,您可以在开始导入时缓存数据库中的列名,因为它们不应该更改。
如果您同时运行多个导入,那么您需要确保在导入期间有完整的表锁定,因为竞争条件可能会出现。
我为SQL DB做了很多自动导入,而且我还没有看到你提出的问题,因为假设要求人们知道进入数据库的数据。提前知道列通常是非常糟糕的事情,但听起来你有一个例外规则。
答案 6 :(得分:1)
保留(或创建)数据库中目标表的列的运行时表示。在导入每个文件之前,请检查列是否已存在。如果没有,请运行相应的ALTER语句。然后导入文件。
实际的导入过程可以并且可能应该由BCP或您提供的任何批量协议来完成。由于源数据和目标仅在逻辑上而非物理上对齐,因此您必须进行一些奇特的kajiggering。所以你需要BCP格式的文件。
答案 7 :(得分:0)
对于这些数据卷,您应该使用ETL。 See this tutorial
ETL专为大量数据操作而设计