在SQL Server中查找/更新重复人员的最佳方法

时间:2019-12-18 17:09:02

标签: sql-server entity-framework

我有一个从几个供应商处导入包含“人”信息的CSV文件的过程。该过程必须从CSV中读取人员,并确定是否需要在数据库中插入或更新人员。

一个人实际上可以存在于不同供应商的CSV中-因此,我不能只是通过ID查找每个人(每个供应商的“人员”都有不同的ID)。因此,我必须通过查看以下内容来确定此人是否是数据库新手:

  1. 供应商ID + VendorAssignedID(即正在处理的供应商ID及其唯一的个人ID)
  2. SSN
  3. 名字+姓氏+生日

如果找到匹配项,我需要使用供应商CSV中任何已更改的信息来更新此人。如果找不到匹配项,则需要插入此人。

每个CSV可能包含多达1000个人。必须对照数据库检查每个人,看看是否需要插入或更新他们。如果数据库包含10,000多个人员,则无论有没有EF Core(似乎每个CSV可能读取10,000,000次读取),这似乎都会非常缓慢。

我目前在项目中使用EF Core,但在这个特定领域,似乎EF Core似乎并不能胜任这项任务。

我很好奇其他人如何解决此类问题?做这样的事情,我最快的选择是什么?一系列MERGE语句,用EF Core调用的存储过程?

其他信息

根据一些答案,我想添加以下内容。

首先,CSV文件具有不同的格式-不同的列名,不同的值类型(现在,一个供应商可能使用数字标识性别,而另一个供应商可能使用字母)。

正在通过.Net Core Web API将CSV文件上传到服务器。 Controller / Action解析CSV文件,将值转换为通用格式,并创建包含数据的Person对象的列表。

因此,实际上,比较是每个Person对象中的数据与数据库中的数据之间的比较。

2 个答案:

答案 0 :(得分:0)

我将假定您的CSV是固定的且已知的格式,因为它将使事情变得容易一些。

我将分阶段进行导入:

  1. 您将所有CSV行解析并提取到tblCsvImport中,除了CSV文件名(id?)以及当时可以确定的任何内容外,没有太多限制。所有列都可以为空,并且尚未完成匹配。
  2. 您运行的存储过程会根据您的规则执行MERGE,并在完成后有选择地清除表

如果您的CSV格式比较灵活,则您可能需要做更多工作,因为您必须存储原始行并将其解析到存储的proc中。根据您的复杂性,在获取表行上的游标可能更易于实现(尽管请记住,SQL Server中的游标带有一些污名,以降低性能)

答案 1 :(得分:0)

如果有可能,这可能是效果最好的选项:

  1. bulk insert的csv文件放入新表(如果架构不变,则保留现有表,如果保留表,则将其截断作为第一步)
  2. 编写merge statement进行必要的插入/更新(并在需要时删除)
  3. 从第1步中删除(或截断)表