3

我正在将数据从一个系统迁移到另一个系统,并将收到一个包含要导入数据的 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。

4

2 回答 2

4

您如何将其加载到临时表中(请注意,这在逻辑上可能是临时的 - 不一定在技术上)作为登台,然后从那里处理它。这是标准的 ETL 行为(对于 ETL,一百万是微不足道的),您首先对数据进行分级,然后对其进行清理,然后将其放到最终位置。

于 2013-01-09T21:50:57.277 回答
0

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

于 2013-01-09T22:29:10.603 回答