Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将20个100mb CSV文件批量插入SQL Server_C#_Sql_Sql Server_Ssis - Fatal编程技术网

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

C# 如何将20个100mb CSV文件批量插入SQL Server,c#,sql,sql-server,ssis,C#,Sql,Sql Server,Ssis,我有大约20个.csv文件,每个文件大约100-200mb 它们每个都有大约100列 每个文件中90%的列相同;但是,有些文件有更多的列,有些文件有更少的列 我需要将所有这些文件导入SQLServer2008数据库中的一个表中 如果该字段不存在,我需要创建它 问题:导入的过程应该是什么?如何更高效、更快速地将所有这些文件导入数据库中的一个表中,并确保如果字段不存在,则创建该字段?请记住,同一字段可能位于不同的位置。例如,在一个csv文件中,CAR可以位于字段AB,而在另一个csv文件中,相同的字

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

它们每个都有大约100列

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

我需要将所有这些文件导入SQLServer2008数据库中的一个表中

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


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

我建议查看SQL Server附带的
BCP
程序,该程序旨在帮助完成以下作业:

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

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

另外,请看一下此SO线程,以及有关将CSV文件导入SQL Server的内容:


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

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

使用System.Data.SqlClient中的SqlBulkCopy类


它有助于批量数据传输。仅捕获它不会与DataTime DB列一起工作

这里有几种可能性

  • 如果SSIS对您可用,您可以使用它
  • 在Sql Server中,您可以使用SqlBulkCopy在暂存表中进行大容量插入,您将在其中插入整个.csv文件 然后使用一个可能包含语句的存储过程 将每一行放置在它所属的位置,或创建一个新的行(如果不属于该行) 存在
  • 您可以使用C代码读取文件,并使用SqlBulkInsert或

    • 答案少了,方向多了,但我走了。我的方法是首先枚举CSV文件和DB中的列名,然后确保CSV中的列名都存在于目标中

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

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


      我为SQL数据库进行了大量的自动导入,但我从未见过您提出的要求,因为这是一个假定的要求,即人们知道进入数据库的数据。提前不知道列通常是一件非常糟糕的事情,但听起来您有一个例外。

      对于这些数据卷,您应该使用ETL

      ETL是为大量数据操作而设计的

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


      实际的导入过程可以而且可能应该由BCP或任何可用的批量协议完成。由于源数据和目标数据只在逻辑上对齐,而不是在物理上对齐,因此您必须执行一些奇特的Kajigger操作。因此,您需要BCP格式的文件。

      这是一件持续的事情吗?或者一次导入?@JohnHartsock为什么要问?因为创建SSIS包或临时将文件导入哑表可能更容易,然后使用TSQL导入数据。一次只需使用bcp导入每个文件。您应该已经清楚地了解了有多少列,以及表中的每列如何映射到每个csv中的字段。您还应该了解csv数据是如何反规范化为关系的。我在金融领域也看到过这种情况。我一点也不惊讶。但是是的,这很烦人/尴尬。如果能知道为什么否决票。。。快速评论可能会有所帮助;)插入目标(colA,colB,colC)选择null,colB,colC从导入的联合选择colA,colB,colC从导入的联合选择colA,colB,colC从导入的联合选择colA,null,null您需要跳过重复项-使用联合而不是联合all@I__:如果您采用联合方式,请使用“union all”,因为“union”运行一个不同的命令。这就是你插入后我会做的#1) 向目标表添加任何额外的列#2)以编程方式生成“begin tran insert dest_table([columns1]…[columnN])选择[columns1]…[columnN]from src_table commit tran”@Bengie-我已经在单独的注释中注意到了它,但没有注意到它。我使用九月的评论仅仅是因为我用手机在这里写作。这很痛苦:-)@Oleg-Dok:我想我把名字弄错了,并改正了。对不起,有什么困惑。我想我的困惑是会传染的。