【发布时间】:2015-04-13 00:25:09
【问题描述】:
我每小时安排一个 ssis 包,该包每次都会生成一个平面文件(文本文件)。
有没有办法为每个生成的平面文件生成一个标题?
我正在考虑使用 'UNION' 来合并两个平面文件(标题和正文),但是我无法控制哪个文件先去。
有什么想法吗?
【问题讨论】:
标签: ssis
我每小时安排一个 ssis 包,该包每次都会生成一个平面文件(文本文件)。
有没有办法为每个生成的平面文件生成一个标题?
我正在考虑使用 'UNION' 来合并两个平面文件(标题和正文),但是我无法控制哪个文件先去。
有什么想法吗?
【问题讨论】:
标签: ssis
单击连接管理器中的连接并设置 "ColumnNamesInFirstDataRow" = True 。
【讨论】:
我通过创建两个单独的数据流任务来实现这一点。第一个获取并汇总数据并添加其他字段以制作第一个标题记录。第二个任务将它们的独立元数据添加到行中。技巧是在第一个平面文件目标中覆盖前一个文件,在第二个目标中使用相同的文件但取消选中覆盖数据。如果文件名是动态的,您可以将文件名设置为全局变量,并在启动时初始化它和带时间戳的文件名,然后使用该变量作为目标文件名。
【讨论】:
这可能会更简单,这取决于您的偏好:
COPY HeaderFile.TXT + InputFile.TXT OUTPUT.TXT 将文件粘贴在一起如果文件末尾有箭头字符,请改用:
COPY /B HeaderFile.TXT + InputFile.TXT OUTPUT.TXT
(见an arrow → character getting appeded to files in a .bat script)
【讨论】:
/B来复制命令。我将相应地编辑答案
在我的 SSIS 中,实际上在自定义属性下有一个名为 Header 的属性。对我来说效果很好。
* 刚刚发现您还可以使用具有属性 [Flat File Destination].[Header] 的表达式并将其设置为数据流任务上的变量。
【讨论】:
当然。使用脚本组件是我发现的最简单的方法。我曾尝试使用平面文件目标将我想要的数据写入文本文件,然后使用脚本任务附加页眉和页脚。如果你愿意,你可以这样做。
我发现一步完成会更简单,即将您的数据流路由到脚本任务中,该脚本任务在 PreExecute 中写入标头,在 ProcessInputRow 中写入所有数据行,并在 PostExecute 中选择页脚。
类似的东西;
TextWriter tw;
public override void PreExecute()
{
base.PreExecute();
tw = new StreamWriter(Variables.requestFname);
tw.WriteLine("HEADER");
}
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
tw.WriteLine(Row.WhateverFieldsYouNeed);
}
public override void PostExecute()
{
base.PostExecute();
tw.WriteLine("FOOTER");
tw.Close();
}
【讨论】:
Object 类型变量,您可以使用它来处理动态情况,例如从表中选择并将数据转储到Object 类型的变量中。
您还可以使用数据流的属性。
转到控制流页面 选择数据流组件的属性面板 转到表达式并选择[平面文件目标]。[标题] 在这里你可以动态地设置这个属性的值
【讨论】: