Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ssis 使用SSI为平面文件目标创建标头_Ssis - Fatal编程技术网

Ssis 使用SSI为平面文件目标创建标头

Ssis 使用SSI为平面文件目标创建标头,ssis,Ssis,我每小时都有一个ssis包,该包每次都生成一个平面文件(文本文件) 是否有方法为生成的每个平面文件生成头 我正在考虑使用“UNION”来合并两个平面文件(头文件和正文文件),但是我无法控制哪个文件会先合并 有什么想法吗?当然有。使用脚本组件是我发现的最简单的方法。我曾经尝试过使用平面文件目标将想要的数据写入文本文件,然后使用脚本任务附加页眉和页脚。如果你愿意,你可以那样做 我发现只需在一个步骤中完成就可以了,也就是说,将数据流路由到一个脚本任务中,该任务在PreExecute中写入页眉,在Pro

我每小时都有一个ssis包,该包每次都生成一个平面文件(文本文件)

是否有方法为生成的每个平面文件生成头

我正在考虑使用“UNION”来合并两个平面文件(头文件和正文文件),但是我无法控制哪个文件会先合并


有什么想法吗?

当然有。使用脚本组件是我发现的最简单的方法。我曾经尝试过使用平面文件目标将想要的数据写入文本文件,然后使用脚本任务附加页眉和页脚。如果你愿意,你可以那样做

我发现只需在一个步骤中完成就可以了,也就是说,将数据流路由到一个脚本任务中,该任务在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();
}
这可能更简单,具体取决于您的偏好:

  • 创建一个带有标题的文本文件
  • 在执行流程任务中,运行以下命令:
    COPY HeaderFile.TXT+InputFile.TXT OUTPUT.TXT
    将文件粘在一起
  • 如果文件末尾有箭头字符,请改为使用:

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


    (请参阅)

    在我的SSIS中,自定义属性下实际上有一个名为Header的属性。对我来说工作得很好。

    *刚刚发现还可以使用带有属性[Flat File Destination].[Header]的表达式,并将其设置为数据流任务上的变量。

    我通过创建两个单独的数据流任务来实现这一点。第一个将获取和汇总数据,并添加其他字段以生成第一个标题记录。第二个任务在我们创建的行中添加它们的独立元数据。技巧是在第一个平面文件目标中让它覆盖上一个文件,在第二个目标中使用相同的文件,但取消选中覆盖数据。如果文件名是动态的,您可以将文件名设置为全局变量,并在开始时对其进行初始化,然后使用带有时间戳的文件名,然后将该变量用作目标文件名。

    您还可以使用数据流的属性

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

    单击连接管理器中的连接,并将“ColumnNamesInFirstDataRow”设置为True

    谢谢,但是标题当然每次都会动态变化。“HEADER”只是您需要的任何动态HEADER的占位符。例如,就像我使用Variables.requestFname来确定文件将写入何处一样,您可以在SSIS中创建另一个字符串变量来表示头。您可以在运行时对表达式求值,并用Variables.HeaderVariable替换代码中的“HEADER”。有意义吗?是的,我稍后会试试。但是,“header”超过255个字符,我不确定它是否可以包装在变量中?SSIS中有一个
    Object
    类型变量,可以用来处理动态情况,例如从表中选择并将数据转储到
    Object
    类型的变量中。我尝试了这种方法,但它似乎在输出的末尾包含一个箭头符号?这很奇怪。。。原始文件中不存在箭头符号?如果在文本编辑器中检查Ascii码,它是什么字符?您使用哪个文本编辑器查看?根据这一点:您需要使用
    /B
    来复制命令。我将据此编辑answe。唯一的遗憾是该方法无法动态生成输出文件名?我需要在bat文件中指定名称?您可以使用表达式填充执行过程任务的内容。那会让你这么做的。在某些情况下,使用脚本可能更好,但我认为目前为止还不错。仅供参考:此选项仅在查看特定于数据流任务的表达式时出现在选项列表中。如果右键单击平面文件目标对象并查看属性/表达式,但仅当右键单击并打开任务本身的属性时,此选项才可见。这让我在尝试实现这一点之前耽误了一段时间。非常好,这是一个非常简单的解决方案@Chris,您可以添加一个页脚数据流任务…^——这里就是真正的答案!