将数据从平面文件加载到 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值