将数据从平面文件加载到 Sql Server 表,并使用 SSIS 导出到 excel

Posted

技术标签:

【中文标题】将数据从平面文件加载到 Sql Server 表,并使用 SSIS 导出到 excel【英文标题】:Load data from flat file to Sql Server table and also export to excel using SSIS 【发布时间】:2020-11-17 03:17:43 【问题描述】:

问题陈述:要求很简单,就是我们有一个平面文件(基本上是csv),我们需要将它加载到Sql Server 数据库中的一个表中。当我们必须派生一个新列(平面文件中不存在)并将其与文件中的其余列一起填充时,就会出现问题。 新列的推导逻辑是——求“TransactionDate”的最大日期。

整个练习将在SSIS 中执行,我们希望通过使用DataFlowTask 来完成它,但一直坚持如何派生新列,然后将其添加到目标流中。

想法

    使用DataFlowTask 读取文件,然后将其存储在recordset 中,这样在ControlFlow 中我们将使用ScriptTask 将其读取为DataTable 并使用LINQ 排序来确定最大值列并将其推送到另一个DataFlow 以供Sql table 使用(但我想这需要在我会避免的数据库中创建tabletype) 在DataFlowTask 本身中执行整个操作,我们将需要Asynchronous transformation(获取所有数据并找出最大值)

我们在这里有点想不通,任何线索都将不胜感激,如果在这方面需要任何进一步的信息,请告诉我们。

【问题讨论】:

所以从 CSV 加载的每条记录在加载到目标表时都应该具有相同的 MAX Transaction 日期? @AaronHughes - 这是正确的,只需要为批次导出一次 TransactionDate 的最大值,并且在加载到表时该特定批次的最大值是相同的。 为什么不先加载批处理,然后运行执行 SQL 任务来执行更新?没有什么说你不能在加载后修改表中的数据。 你不能限制你的更新语句只更新 TransactionDate 为空的地方吗?我认为您可能在这里过度设计您的解决方案。当然,您可以使用脚本任务并读取记录集,将最大值保存到变量中并将所有内容写入表中。但是你应该吗?运行数据流然后执行更新不是更容易、更容易理解吗? 当然,没问题。我发布了一个解决方案,以便您可以将其标记为已关闭,哈哈。 【参考方案1】:

运行数据流任务以将数据插入目标表。紧随其后的是执行 SQL 任务,该任务根据表中具有 NULL(或其他新记录指示符)MaxTransactionDate 的值计算 MAX(TransactionDate)

【讨论】:

以上是关于将数据从平面文件加载到 Sql Server 表,并使用 SSIS 导出到 excel的主要内容,如果未能解决你的问题,请参考以下文章

需要将一个 150GB 的 SQL Server 表导出到多个管道分隔的平面文件中

使用 SSIS 脚本任务将数据从多个 SQL 表导出到不同的平面文件

使用SSIS从SQL Server 2005中的平面文件导入时如何保留NULL值

使用 SSIS 将数据加载到 SQL Server 中的多个表

调整SQL Server中的大型查询

将txt文件内容导入sql server 数据库表中