使用SSIS创建平面文件目标的头部

3
我有一个按小时调度的SSIS包,每次该包都会生成一个平面文件(文本文件)。
是否有办法为每个生成的平面文件生成标题?
我考虑使用“UNION”合并两个平面文件(标题和正文),但我无法控制哪个文件先执行。
有什么想法吗?
6个回答

6

在连接管理器中点击连接,将 "ColumnNamesInFirstDataRow" 设置为 True。


3

在我的SSIS中,实际上有一个名为“Header”的自定义属性。这对我非常有用。
* 刚刚发现您还可以使用属性[Flat File Destination].[Header]的表达式,并将其设置为数据流任务上的变量。


请注意:此选项仅在查看数据流任务的表达式时出现在选项列表中。如果您右键单击平面文件目标对象并查看属性/表达式,则不会显示此选项,但只有在右键单击并打开任务本身的属性时才会显示。当我尝试使其工作时,这让我困惑了一段时间。 - Dinglemeyer NeverGonnaGiveUUp

2
我通过创建两个独立的数据流任务来实现这一点。第一个任务将数据求和并添加其他字段,以生成第一个标题记录。第二个任务将带有独立元数据的行添加进去。关键在于第一个扁平文件目标必须覆盖之前的文件,而第二个目标使用相同的文件,但取消勾选覆盖数据。如果文件名称是动态的,您可以将文件名设置为全局变量,并在启动时进行初始化和时间戳文件名称,然后使用该变量作为目标文件名。

太好了,@Chris提供的解决方案非常简单,你还可以添加一个页脚数据流任务... - Artemination

1

根据您的喜好,这可能更简单:

  1. 创建一个包含标题的文本文件
  2. 在执行进程任务中运行以下内容:COPY HeaderFile.TXT + InputFile.TXT OUTPUT.TXT以将文件粘合在一起

如果您在文件末尾得到箭头字符,请改用以下内容:

COPY /B HeaderFile.TXT + InputFile.TXT OUTPUT.TXT

(参见.bat脚本中文件附加了箭头→字符)


我尝试了这种方法,但似乎在输出的末尾包含了一个箭头符号? - ryan
很奇怪...原始文件中没有箭头符号?如果在文本编辑器中检查Ascii代码,它是什么字符?你使用哪个文本编辑器来查看? - Nick.McDermaid
根据这个链接:https://dev59.com/12015IYBdhLWcg3w7wIW%E2%86%92-character-getting-appeded-to-files-in-a-bat-script,你需要在复制命令中使用“/B”。我会相应地编辑答案。 - Nick.McDermaid
1
唯一的遗憾是这种方法无法动态生成输出文件名?我需要在bat文件中指定名称吗? - ryan
您可以使用表达式填充“执行进程任务”的内容。这将使您能够实现此操作。但在某些情况下,使用脚本可能更好,不过目前为止我认为还不错。 - Nick.McDermaid

0

当然可以。使用脚本组件是我发现最简单的方法。我曾经尝试过使用平面文件目标将所需的数据写入文本文件,然后使用脚本任务附加头和尾。如果你喜欢,你也可以这样做。

我发现只需要一步就可以完成,即将数据流路由到脚本任务中,在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();
}

谢谢,但是标题每次都会动态更改。 - ryan
当然。 "HEADER"只是您需要的任何动态标题的占位符。例如,就像我使用Variables.requestFname来确定文件将被写入的位置一样,您可以在SSIS中创建另一个字符串变量来表示标题。您可以在运行时将其评估为表达式,并用Variables.HeaderVariable替换我的代码中的"HEADER"。明白了吗? - CustodianOfCode
是的,我稍后会尝试这个。但是,“header”超过255个字符,我不确定它是否可以包装在一个变量中? - ryan
在SSIS中有一个“Object”类型的变量,您可以使用它来处理动态情况,例如从表中选择并将数据转储到“Object”类型的变量中。 - S1r-Lanzelot

0

你也可以使用数据流的属性。

转到控制流程页面 选择数据流组件的属性面板 进入表达式,选择 [Flat File Destination].[Header] 在这里,您可以动态设置此属性的值或不设置


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接