使用 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();
}

这个可能更简单,具体取决于您的偏好:

  1. 使用您的 header
  2. 创建一个文本文件
  3. 在执行进程任务中 运行 这个: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 。