我需要创建一个新的 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 行的数据集,以检查它是否满足您的需求。
我需要将一些 .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 行的数据集,以检查它是否满足您的需求。