使用 ssis 为平面文件目标创建 header
create a header for flat file destination using ssis
我每小时安排一个 ssis 程序包,该程序包每次都会生成一个平面文件(文本文件)。
有没有办法为每个生成的平面文件生成 header?
我正在考虑使用 'UNION' 来合并两个平面文件(header 和 body),但是我无法控制先合并哪个文件。
有什么想法吗?
当然可以。使用脚本组件是我发现的最简单的方法。我曾尝试使用平面文件目标将我想要的数据写入文本文件,然后使用脚本任务附加 header 和页脚。如果你愿意,你可以这样做。
我发现一步完成更简单,即将您的数据流路由到一个脚本任务中,该任务在 PreExecute 中写入 header,在 ProcessInputRow 中写入所有数据行,还可以选择一个页脚在执行后。
像这样;
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();
}
这个可能更简单,具体取决于您的偏好:
- 使用您的 header
创建一个文本文件
- 在执行进程任务中 运行 这个:
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)
在我的 SSIS 中实际上有一个 属性 在名为 Header 的自定义属性下。对我来说效果很好。
* 刚刚发现您还可以将表达式与 属性 [Flat File Destination].[Header] 一起使用,并将其设置为数据流任务中的变量。
我通过创建两个单独的数据流任务来完成此任务。第一个获取并汇总数据并添加其他字段以创建第一个 header 记录。第二个任务在行中添加了它们的独立元数据。技巧是在第一个平面文件目标中让它覆盖以前的文件,在第二个目标中使用相同的文件但取消选中覆盖数据。如果文件名是动态的,您可以将文件名设置为全局变量并在启动时初始化它和 time-stamped 文件名,然后使用该变量作为目标文件名。
您还可以使用数据流的属性。
转到控制流页面
Select 数据流组件的属性面板
转到表达式和 select [平面文件目标]。[Header]
在这里您可以动态或不动态设置此 属性 的值
单击连接管理器中的连接并设置 "ColumnNamesInFirstDataRow" = True 。
我每小时安排一个 ssis 程序包,该程序包每次都会生成一个平面文件(文本文件)。
有没有办法为每个生成的平面文件生成 header?
我正在考虑使用 'UNION' 来合并两个平面文件(header 和 body),但是我无法控制先合并哪个文件。
有什么想法吗?
当然可以。使用脚本组件是我发现的最简单的方法。我曾尝试使用平面文件目标将我想要的数据写入文本文件,然后使用脚本任务附加 header 和页脚。如果你愿意,你可以这样做。
我发现一步完成更简单,即将您的数据流路由到一个脚本任务中,该任务在 PreExecute 中写入 header,在 ProcessInputRow 中写入所有数据行,还可以选择一个页脚在执行后。
像这样;
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();
}
这个可能更简单,具体取决于您的偏好:
- 使用您的 header 创建一个文本文件
- 在执行进程任务中 运行 这个:
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)
在我的 SSIS 中实际上有一个 属性 在名为 Header 的自定义属性下。对我来说效果很好。
* 刚刚发现您还可以将表达式与 属性 [Flat File Destination].[Header] 一起使用,并将其设置为数据流任务中的变量。
我通过创建两个单独的数据流任务来完成此任务。第一个获取并汇总数据并添加其他字段以创建第一个 header 记录。第二个任务在行中添加了它们的独立元数据。技巧是在第一个平面文件目标中让它覆盖以前的文件,在第二个目标中使用相同的文件但取消选中覆盖数据。如果文件名是动态的,您可以将文件名设置为全局变量并在启动时初始化它和 time-stamped 文件名,然后使用该变量作为目标文件名。
您还可以使用数据流的属性。
转到控制流页面 Select 数据流组件的属性面板 转到表达式和 select [平面文件目标]。[Header] 在这里您可以动态或不动态设置此 属性 的值
单击连接管理器中的连接并设置 "ColumnNamesInFirstDataRow" = True 。