【问题标题】:create a header for flat file destination using ssis使用 ssis 为平面文件目标创建标头
【发布时间】:2015-04-13 00:25:09
【问题描述】:

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

有没有办法为每个生成的平面文件生成一个标题?

我正在考虑使用 'UNION' 来合并两个平面文件(标题和正文),但是我无法控制哪个文件先去。

有什么想法吗?

【问题讨论】:

    标签: ssis


    【解决方案1】:

    单击连接管理器中的连接并设置 "ColumnNamesInFirstDataRow" = True 。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 很好,一个非常简单的解决方案@Chris,你可以添加一个页脚数据流任务......
      【解决方案3】:

      可能会更简单,这取决于您的偏好:

      1. 创建带有标题的文本文件
      2. 在执行进程任务中运行: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

      【讨论】:

      • 我试过这个方法,但是输出的末尾好像有箭头符号?
      • 这很好奇......原始文件中没有箭头符号?如果您在文本编辑器中检查 Ascii 代码,它是什么字符?您使用哪个文本编辑器查看?
      • 据此:stackoverflow.com/questions/6313960/…你需要使用/B来复制命令。我将相应地编辑答案
      • 唯一遗憾的是这个方法不能动态生成输出文件名?我需要在 bat 文件中指定名称吗?
      • 您可以使用表达式填充执行流程任务的内容。那会让你这样做。在某些时候,使用脚本可能会更好,但我认为到目前为止还不错。
      【解决方案4】:

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

      【讨论】:

      • 仅供参考:此选项仅在查看专门用于数据流任务的表达式时出现在选项列表中。如果您右键单击平面文件目标对象并查看属性/表达式,这将不可见,但前提是您右键单击并打开任务本身的属性。在尝试完成这项工作时,这让我早有一段时间了。
      【解决方案5】:

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

      我发现一步完成会更简单,即将您的数据流路由到脚本任务中,该脚本任务在 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();
      }
      

      【讨论】:

      • 谢谢,但标题每次都会动态变化
      • 当然。 “HEADER”只是您需要的任何动态标题的占位符。例如,就像我使用 Variables.requestFname 来确定文件将写入的位置一样,您可以在 SSIS 中创建另一个字符串变量来表示标题。您可以在运行时将此评估为表达式,并将我的代码中的“HEADER”替换为 Variables.HeaderVariable。有意义吗?
      • 是的,我稍后再试试。但是,“标题”有超过 255 个字符,我不确定它是否可以包装在变量中?
      • SSIS 中有一个Object 类型变量,您可以使用它来处理动态情况,例如从表中选择并将数据转储到Object 类型的变量中。
      【解决方案6】:

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

      转到控制流页面 选择数据流组件的属性面板 转到表达式并选择[平面文件目标]。[标题] 在这里你可以动态地设置这个属性的值

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 2014-12-23
        • 1970-01-01
        • 1970-01-01
        • 2018-10-26
        • 1970-01-01
        相关资源
        最近更新 更多