Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.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# 将csv文件中的数百万条记录插入SQL Server数据库的正确方法是什么?_C#_Sql Server_Database_Csv_Sqlbulkcopy - Fatal编程技术网

C# 将csv文件中的数百万条记录插入SQL Server数据库的正确方法是什么?

C# 将csv文件中的数百万条记录插入SQL Server数据库的正确方法是什么?,c#,sql-server,database,csv,sqlbulkcopy,C#,Sql Server,Database,Csv,Sqlbulkcopy,我必须将.csv文件中的4000万条记录插入数据库,下面是我遵循的过程 Windows服务1: 读取CSV 验证记录 使用SqlBulkCopy将有效记录插入成功表中间表。 Windows服务2 一次从成功表中获取10000条记录 为这10000人开一辆foreach 将每条记录发送到数据库以插入主表。 Windows服务1大约需要30-40分钟,但Windows服务2至少需要5小时才能完成任务。我有两种方法可以做到这一点,但无法决定哪种更好,也无法接受建议 创建4个单独的windows服务并同

我必须将.csv文件中的4000万条记录插入数据库,下面是我遵循的过程

Windows服务1:

读取CSV 验证记录 使用SqlBulkCopy将有效记录插入成功表中间表。 Windows服务2

一次从成功表中获取10000条记录 为这10000人开一辆foreach 将每条记录发送到数据库以插入主表。 Windows服务1大约需要30-40分钟,但Windows服务2至少需要5小时才能完成任务。我有两种方法可以做到这一点,但无法决定哪种更好,也无法接受建议

创建4个单独的windows服务并同时处理40000条记录 使用工作表,我们可以使用while循环 从windows服务异步调用过程
我最大的疑问是,我们正在过程中使用事务,并且将异步处理它,因为根据我的假设,使用事务锁表和其他进程需要处理它。

我认为您在这项工作中使用了错误的工具。 c应用程序或许可以做到这一点,但有一种更强大的方法可以使用集成服务实现这一点

我在这里猜测,但是中间的这些表是转换或检查,或者是把进口批下来?

SSI可以使用it日志限制和SQL批量导入工具完成所有这些工作。我目前负责医院数据导入,每天晚上大约有8000000条记录,这只需要几分钟而不是几个小时


关于SQL如何处理如此大的数据输入的一个很好的解读是

数百万?SqlBulkCopy是唯一的一个。运行foreach可能是薄弱环节。如果您正在使用游标,则考虑重写查询,以便将其设置为基于。我们在Windows服务1中使用SQLBulkCopy-但在第二个Windows服务过程中执行某些验证,因此不能使用BulkSimple。另一件事是,当使用批量复制时,假设使用SQL批量复制一次插入一组1个LAKH记录。然后,即使一条记录失败,我也需要记录此错误,或者至少需要知道哪个记录有此错误,因此,如果采用不同的方法,使用bulkcopyBit是不可能的,但这对SSI来说是不可能的?集成服务有一个大容量插入,可以在中间进行转换。我非常怀疑它是否会在SSIS中花费一个多小时。为什么服务2要执行单独的insert语句,为什么它不只是insert into。。。选择?目前我正在查看ssis,以前从未使用过它,因此任何此类文章都可以帮助我查看当前的youtube和google搜索结果。之所以使用中间表,是因为csv文件中的值链接到另一个表,我们需要将主键插入主表,就像我们从csv中获得名称一样我们将名称插入到这个中间表中,然后将该用户的主键更新到这个表中,并在第二个表中只插入主键。啊,是的,我的数据集中也有这个问题。当前我运行一个SQL命令来更改我的目标表,删除PK并在批处理结束时设置它。我知道这有点冒险,但我在那个表上有一个聚集索引,创建另一个聚集索引会占用计算时间。如果您有pluralsight,它有一些很棒的SSIS功能,目前我们的系统上没有安装SSIS和pluralsight,我们还有其他方法可以做到这一点吗?因为创建sql命令是可以的,但由于它是一个银行项目,所以无法承担这种风险,因为验证这些帐户对我来说又是一项困难的任务。现在完全迷失了,正在考虑编写10个windows服务任何建议我建议避免编写服务。一个很好的想法是,如果你已经在数据层了,不要试图跳出去只是为了回到数据层。我强烈建议安装集成服务。你为什么不能那样做?如果您有SQL标准,它是免费的,并使用MSSQL打包。如果您绝对不能使用SSIS,您可以将SQL批量插入技术与SQL代理结合使用。这不是一个好的解决方案,这里可能会出现很多问题