我需要创建一个新的 ETL C# 进程,其中包含大型 .CSV 文件到 SQL 表 Add/Update 记录

I need to create a new ETL C# process with large .CSV files to SQL Tables Add/Update records

我需要将一些 .CSV 文件导入唯一键控 SQL Tables(Table 名称和列名称从源到目标匹配)。我开始查看像 Cinchoo-ETL 这样的库,但我需要做一个“更新插入”,意思是如果记录存在则更新,如果记录不存在则插入。我不确定 Cinchoo-ETL 或其他一些库是否内置了此功能。

例如假设 SQL 服务器客户 table 中有一些记录,Cust# 是主键

客户#姓名

1 鲍勃

2 杰克

CSV 文件如下所示:

客户#,姓名

2,吉尔

3,罗杰

当 ETL 程序运行时,它需要将 Cust# 2 从 Jack 更新为 Jill,并为 Roger 插入一条新的 cust# 3 记录。

速度可重用性很重要,因为会有 80 多个不同的 tables,其中一些 tables 可以有几百万条记录。

有什么快速简便的方法可以做到这一点吗?请记住,我不是日常开发人员,所以示例会很棒。

谢谢!

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

-- 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 (www.fuzible-app.com) :在同步模式下,它允许您选择目标 table 的行为(允许插入、更新、删除)并且您的源可以是任何 CSV 文件和您的目标,任何数据库。 如果您需要操作方法,可以通过网站与我联系。 该软件是免费的:)

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

如果 CSV 和数据库 table 共享相同的架构(相同的列),则无需编写更复杂的查询

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

我建议您看一下 nuget 包 ETLBox and the necessary extension packages for Csv & Sql Server (ETLBox.Csv + ETLBox.SqlServer)。

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

//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);

截取的这段代码会为一个文件执行相应的 inserts/updates 并删除到数据库 table 中。确保 header 名称与数据库中的列名称完全匹配 table (case-sensitive)。对于更大的数据集,您需要启用部分缓存,以避免将所有数据加载到内存中。

它将在幕后使用动态 objects (ExpandoObject)。您可以在网站 (www.etlbox.net)

上找到有关合并和工具的更多信息

唯一的缺点是ETLBox不是开源的。但该软件包允许您处理最多 10.000 行的数据集,以检查它是否满足您的需求。