我需要解决我正在处理的问题:
我在C#.Net中编写一个数据同步器,它将接收CSV文件,一个用于SQL Server数据库中的每个表。
csv文件中的某些行将引用数据库中的现有行,需要更新,有些行将引用新行,需要插入。
由于可能有很多文件(大约20个),并且每个文件中可能包含很多行,我如何才能使其可扩展?此时读取一行,连接到数据库以确定是否存在具有相同ID的行(以确保它是更新还是插入)然后再进行实际更新或插入的连接似乎很浪费
答案 0 :(得分:3)
将所有内容加载到临时表(批量插入)
对目标表执行合并更新。
答案 1 :(得分:2)
您应该使用SQL Server Integration Services进行此类工作。
SSIS是数据集成和工作流应用程序的平台。它具有快速灵活的数据仓库工具,用于数据提取,转换和加载(ETL)。
答案 2 :(得分:0)
也可以使用CsvReader
作为参考答案 3 :(得分:0)
最好的方法是使用SSIS。在SSIS中我们有csv阅读器组件(平面文件源),它处理所有类型的平面文件(管道或制表符分隔等)。使用查找你可以查看现有的行该表然后你可以使用Oledb组件更新,插入或删除。
如果您不想使用SSIS,则可以采用另一种方式使用XML存储过程。而不是为每一行访问数据库,您可以将数据作为XML传递,然后在存储过程中进行操作。 / p>
示例:使用XML作为源将数据插入表中
CREATE PROCEDURE [dbo].[sp_Insert_XML]
@XMLDATA xml
AS
BEGIN
SET NOCOUNT ON;
-- Insert statements for procedure here
Insert into RCMReport(
ProjectName
,Category
,EndTime)
Select
XMLDATA.item.value('@ProjectName[1]', 'varchar(255)') AS ProjectName,
XMLDATA.item.value('@Category[1]', 'varchar(200)') AS Category,
XMLDATA.item.value('@EndTime[1]', 'datetime') AS EndTime
FROM @XMLDATA.nodes('//RCMReport/InsertList') AS XMLDATA(item)