我正在将数据从一个系统迁移到另一个系统,并且将接收包含要导入的数据的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。
答案 0 :(得分:4)
如何将其加载到临时表中(请注意,这可能在逻辑上是临时的 - 不一定是技术上的)作为分段,然后从那里处理它。这是标准的ETL行为(对于ETL来说,这是一个很小的行为),您首先对数据进行分级,然后对其进行清理,然后将其放到最终位置。
答案 1 :(得分:0)
当执行这种性质的任务时,你不会考虑单独旋转每个记录,因为这将是一个巨大的性能问题。在这种情况下,您将记录批量插入临时表或使用向导导入到临时表(在地址字段中特别注意50个字符)。然后您编写基于集合的代码来执行任何清理工作需要(删除不良电话号码或邮政编码或电子邮件地址或状态或记录数据库中所需字段中的缺失数据或使用查找表转换数据(假设您的表具有某些必需值,那些可能不是相同的值)您将在此文件中找到,您需要转换它们。我们经常使用医生专业。所以我们的系统可能会将它们存储为GP,但文件可能会给我们一个普通实践者的值。您需要查看所有非匹配的字段的值,然后确定是否可以将它们映射到现有值,如果您需要抛出记录或者需要向查找表添加更多值。一旦您删除了记录,您就不会想要并清理你可以拥有的东西然后,您将导入到prod表。当您编写多个或两个记录时,应使用INSERT的SELECT版本而不是VALUES子句编写插入。