C# 我需要创建一个新的ETL C流程,将大型.CSV文件添加到SQL表添加/更新记录

C# 我需要创建一个新的ETL C流程,将大型.CSV文件添加到SQL表添加/更新记录,c#,sql-server,csv,upsert,C#,Sql Server,Csv,Upsert,我需要将许多.CSV文件放入唯一的键控SQL表中,表名和列名从源到目标匹配。我开始研究像Cinchoo ETL这样的LIB,但我需要做一个Upsert,即如果记录存在,则进行更新;如果记录不存在,则进行插入。我不确定Cinchoo ETL或其他库是否内置了此功能 例如,假设SQL Server客户表中有一些记录,Cust是主键 客户名称 1鲍勃 2杰克 CSV文件如下所示: //Create the components CsvSource source = new CsvSource(&qu

我需要将许多.CSV文件放入唯一的键控SQL表中,表名和列名从源到目标匹配。我开始研究像Cinchoo ETL这样的LIB,但我需要做一个Upsert,即如果记录存在,则进行更新;如果记录不存在,则进行插入。我不确定Cinchoo ETL或其他库是否内置了此功能

例如,假设SQL Server客户表中有一些记录,Cust是主键

客户名称

1鲍勃

2杰克

CSV文件如下所示:

//Create the components

CsvSource source = new CsvSource("file1.csv");

SqlConnectionManager conn = new SqlConnectionManager("..connection_string_here..");

DbMerge dest = new DbMerge(conn, "DestinationTableName");
dest.MergeProperties.IdColumns.Add(new IdColumn() { IdPropertyName = "Cust#" });
dest.MergeMode = MergeMode.Full; //To create the deletes
dest.CacheMode = CacheMode.Partial; //Enable for bigger data sets

//Linking
source.LinkTo(dest);

//Execute the data flow
Network.Execute(source);
客户,姓名

2,吉尔

3,罗杰

ETL程序运行时,需要将Cust 2从Jack更新为Jill,并为Roger插入新的Cust 3记录

速度重用性很重要,因为将有80个左右不同的表,其中一些表中可能有数百万条记录

有没有快速简便的方法可以做到这一点?请记住,我不是一个日常开发人员,所以示例将非常棒


谢谢

这是我在最近的SSIS工作中所做的。我将数据加载到临时表中,只需使用常规SQL查询来执行此比较。在有很多字段的表上,这可能会很麻烦

-- SEE DIFFERENCES FOR YOUR AMUSEMENT
SELECT *
FROM Accounts a
    INNER JOIN
        DI_Accounts da
    ON a.CustomerNumber = da.CustomerNumber AND (
            a.FirstName <> da.FirstName
        )


-- UPDATE BASED ON DIFFERENCES
UPDATE a
    SET
        a.FirstName = a.FirstName
    FROM Accounts a
    INNER JOIN
        DI_Accounts da
    ON a.ModelId = da.ModelId AND (
            a.FirstName <> da.FirstName
        )

你所描述的是我开发的工具无法完成的事情。它被称为Fuzible:在同步模式下,它允许您选择目标表的行为,允许插入、更新、删除,并且您的源可以是任何CSV文件,您的目标可以是任何数据库。 如果您需要操作指南,可以通过网站与我联系。 该软件是免费的:

您需要做的是创建一个作业,将CSV路径作为源连接,然后将数据库作为目标连接。 选择同步模式,与复制模式相反,同步模式将比较源数据和目标数据。 然后,您可以为每个CSV文件编写任意数量的查询,如下所示: MyOutputTable:从MyCSVFile.CSV中选择*

如果CSV和数据库表共享相同的模式列,则无需编写更复杂的查询


软件应该能够完成其余工作:更新需要更新的行,并在需要时创建新行。

我建议您查看nuget软件包以及Csv和Sql Server+所需的扩展软件包

这将允许您编写如下代码:

//Create the components

CsvSource source = new CsvSource("file1.csv");

SqlConnectionManager conn = new SqlConnectionManager("..connection_string_here..");

DbMerge dest = new DbMerge(conn, "DestinationTableName");
dest.MergeProperties.IdColumns.Add(new IdColumn() { IdPropertyName = "Cust#" });
dest.MergeMode = MergeMode.Full; //To create the deletes
dest.CacheMode = CacheMode.Partial; //Enable for bigger data sets

//Linking
source.LinkTo(dest);

//Execute the data flow
Network.Execute(source);
这段代码将对一个文件在数据库表中执行相应的插入/更新和删除操作。确保标头名称与数据库表中的列名完全匹配,区分大小写。对于较大的数据集,需要启用部分缓存,以避免将所有数据加载到内存中

它将使用引擎盖下的动态对象ExpandooObject。您可以在网站上找到有关合并和工具的更多信息


唯一的缺点是ETLBox不是开源的。但该软件包允许您处理多达10000行的数据集,以检查它是否符合您的需要。

通常,这是一个两步过程。1将*.csv文件加载到暂存表中。如果你不是一个经验丰富的开发人员,也不需要太多的业务逻辑:我建议使用SSIS之类的东西来使用作业导入数据。Fuzible包满足了我的所有需求,并使我免于大量不必要的编码!它甚至可以通过SFTP服务器自动完成传输。我有一个每日和每月运行的过程,可以轻松处理超过3000万条记录的文件。