【问题标题】:Create multiple files based on an output of a custom SSIS component根据自定义 SSIS 组件的输出创建多个文件
【发布时间】:2017-01-24 07:26:00
【问题描述】:

我有一个自定义的 SSIS DataFlow 组件,它具有三个输出列:

Id
Name
Content

这是组件输出属性的截图:

组件返回多个这些结果集。我能够将结果通过管道传输到 Flat File Destination,这给了我这样的信息:

{E007818F-B9B9-46FF-9231-07367EB96C4F}, nameA.csv, just a text
{9A36EC87-73BC-497D-9592-47FC119CB6E5}, nameB.csv, another text

我需要将每个结果集写入一个单独的文件,该文件的名称应该是 name 属性,内容应该是 content 结果集的属性。所以在这种情况下所需的输出是两个文件:


nameA.csv

just a text

nameB.csv

another text

不幸的是,结果集计数是动态的,所以我不能只创建多个平面文件目标。

有什么想法吗?

【问题讨论】:

    标签: sql sql-server csv ssis


    【解决方案1】:

    要将数据拆分为两个单独的文件,您需要在源组件之后使用“条件拆分”转换。在编辑器中,为每个结果集拆分创建一个条件,例如

    • 对于拆分 1:
      输出名称:nameA,条件:Content == "nameA"
    • 对于拆分 2:
      输出名称:nameB,条件:Content == "nameB"

    为每个文件配置一个平面文件目标。然后将绿色连接器从 Conditional Split 组件拖到相关的目标组件。

    --更新

    使其动态化更复杂...

    您需要从一个执行 SQL 任务开始,该任务返回 Name 字段中的所有名称;将结果集存储在对象变量中。然后将其链接到包含 数据流 任务的 For-each 循环容器。将 For-each 循环配置为使用 ADO Enumerator 并选择上面创建的对象变量。还要配置一个变量映射以将名称存储在当前枚举中(稍后将用于文件名)。

    在数据流任务中,源组件应该是一个 SELECT 语句,其中 WHERE name = 'Name in object variable'。在目标连接管理器属性上,为上面的 For-each 循环中创建的 ConnectionString = 变量配置一个表达式。这将为每个文件提供迭代中当前名称的名称。

    我希望这会有所帮助。

    【讨论】:

    • 感谢您的回答。我在设计时不知道名称,因为它们是动态的,并且可以从组件返回多达数百个结果集。您的解决方案是静态的 - 不是吗?
    • 非常感谢您的更新。不幸的是,我怀疑这会起作用,因为我没有 SQL Server 来执行一些 SQL,而是一个返回输出的自定义组件 - 或者我错过了什么?无论如何,点赞!
    • 谢谢。您可以先将输出加载到 SQL Server 表中。如果您的环境中没有任何 Express 版本,您可以安装免费的 Express 版本。只是觉得我应该提一下。
    猜你喜欢
    • 2011-03-12
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 2019-09-16
    相关资源
    最近更新 更多