Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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多个表_C#_Sql_Csv_Sql Server 2008 R2 - Fatal编程技术网

C# 将CSV导入SQL多个表

C# 将CSV导入SQL多个表,c#,sql,csv,sql-server-2008-r2,C#,Sql,Csv,Sql Server 2008 R2,我正在将数据从一个系统迁移到另一个系统,并将收到一个CSV文件,其中包含要导入的数据。该文件最多可包含一百万条要导入的记录。我需要获取文件中的每一行,验证它,并将数据放入相关表中。例如,CSV将类似于: Mr,Bob,Smith,1 high street,London,ec1,012345789,work(this needs to be looked up in another table to get the ID) 实际文件中的数据比这个示例多得多 因此,SQL应该是这样的: Decl

我正在将数据从一个系统迁移到另一个系统,并将收到一个CSV文件,其中包含要导入的数据。该文件最多可包含一百万条要导入的记录。我需要获取文件中的每一行,验证它,并将数据放入相关表中。例如,CSV将类似于:

Mr,Bob,Smith,1 high street,London,ec1,012345789,work(this needs to be looked up in another table to get the ID)
实际文件中的数据比这个示例多得多

因此,SQL应该是这样的:

Declare @UserID
Insert into User
Values ('Mr', 'Bob', 'Smith', 0123456789)
Set @UserID = @@Identity
Insert into Address
Values ('1 high street', 'London', 'ec1', select ID from AddressType where AddressTypeName = 'work')
我正在考虑迭代每一行,并使用包含上述SQL的文件中的参数调用SP。这是解决这个问题的最好办法吗?这不是时间关键,因为在更新站点时只需运行一次


我使用的是C#和SQL Server 2008 R2。

如何将其加载到临时表中(注意,这在逻辑上可能是临时的,在技术上不一定是临时的),然后从那里处理它。这是标准的ETL行为(对于ETL来说,一百万是很小的),您首先处理数据,然后清理数据,然后将其放在最后的位置。

在执行这种性质的任务时,您不会考虑单独旋转每个记录,因为这将是一个巨大的性能问题。在这种情况下,您可以将记录大容量插入临时表,或使用向导导入临时表(特别是在地址字段中查找50个字符)。然后编写基于集合的代码来执行所需的任何清理(删除数据库中所需字段中的错误电话号码、邮政编码或电子邮件地址、状态或记录缺失的数据,或使用查找表转换数据。)(假设您有一个带有某些必需值的表,这些值可能与您在此文件中找到的值不同,您需要转换它们。我们经常使用医生专科。因此,我们的系统可能会将它们存储为GP,但该文件可能会给我们一个普通医生的值。您需要查看该字段的所有不匹配值,然后确定是否可以将它们映射到现有值、是否需要丢弃记录或是否需要向查找表中添加更多值。一旦清除了不需要的记录并清理了暂存表中可以使用的记录,则可以导入到prod表中。插入应使用选择版本的INSERT而不是with编写写入一个或两个以上记录时,请使用VALUES子句。

要将CSV导入MS SQL,为什么不使用导入向导(请参见HOWTO).我会遵循TomTom的建议,但使用的是可以自动执行的,而使用的是导入向导,这将是一个挑战…请注意,通常当您无法直接导入文件时,使用批处理作业可以更轻松地将文件转换为另一个文件,该文件可以通过任何内置的导入机制直接上载到DBAaronBertrand它支持的anisms。@AaronBertrand这个向导的全部要点是,你不必一次上传就自动完成它。而且,大容量插入命令的编写速度可能与在这个令人发指的向导中单步执行所有步骤的速度一样快……实际上它确实有效。在我上一个ETL项目中,我们处理了50万个“master”一行一行地查看主控器,然后加载详细信息。20分钟的处理。但我必须同意,我们的硬件需要非常出色。这听起来不错,我会研究一下。因此,基本上我创建了一个临时表,将数据批量加载到其中,然后我可以验证程序中的数据m并使用SP将数据移动到需要的位置…如果我批量插入临时表,是否仍然可以在不使用光标的情况下处理数据?因此,在上面的示例中,我将批量插入CSV数据到临时表中,然后我需要处理临时表中的每一行,以首先插入用户并获取ID并使用该to将其余的数据插入相关表中…当然。99%的SQL都可以在没有游标的情况下发生-只有那些从未正确学习SQL的人才会倾向于使用游标来完成面向集合逻辑的完美示例。我的SQL只是平均值,我看不出你是如何做到的?如果我有一个包含上述数据的临时表,你会怎么做首先插入用户,获取标识值,然后使用该值插入临时表中所有行的其余数据,而不使用游标?关于使用什么的任何指针?2个语句。首先合并到目标表,然后合并到第二个。查找merge语句。