代码之家  ›  专栏  ›  技术社区  ›  Philip

源有0行时不创建文件

  •  6
  • Philip  · 技术社区  · 7 年前

    下面是数据流区域。我遇到的问题是,即使结果为0,它仍在创建文件。

    有人能看到我在这里做错了什么吗?

    enter image description here

    enter image description here

    enter image description here

    2 回复  |  直到 7 年前
        1
  •  2
  •   Alexander Volok    7 年前

    这几乎是人们所期待和知道的令人讨厌的行为。 ssis将创建一个空的平面文件,即使未选中:“第一个数据行中的列名”。

    解决方法是:

    • 如果 @RowCountWriteOff = 0 就在数据流执行之后。

    • 或者,如果源中的预期行数为0,则不要启动数据流: enter image description here


    更新2019-02-11:

    我的问题是我有13个导出到csv命令 数据流,它们是昂贵的查询

    • 然后,再次查询源以提前检查行计数将更加昂贵,并且可能更好地重用变量@rowcountwriteoff的值。
    • 初始设计有13个数据流,添加了13个约束和13个文件系统任务,主控制流将使包更复杂,更难维护。
    • 因此,建议使用 OnPostExecute 事件处理程序,因此清理逻辑与某些特定的数据流隔离:

    enter image description here

        2
  •  2
  •   Hadi    7 年前

    更新1-根据操作注释添加更多详细信息

    基于您的评论,我假设您希望使用SQL命令循环许多表,检查表是否包含行,如果包含行,那么您应该将行导出到平面文件,否则应该忽略表。我将提到实现这一点所需的步骤,并提供包含每个步骤更多详细信息的链接。

    1. 首先,您应该创建一个 Foreach Loop container to loop over tables
    2. 您应该添加一个 Execute SQL Task 使用count命令 SELECT COunt(*) FROM ....) store the Resultset inside a variable
    3. 添加将数据从OLEDB源导入平面文件目标的数据流任务。
    4. 之后你应该 add a precedence constraint with expression ,到数据流任务,表达式类似于 @[User::RowCount] > 0

    此外,检查我提供的链接也很好,因为它们包含许多有用的信息和逐步指南。


    初始答案

    防止SSIS创建空的平面文件是一个常见的问题,您可以在网上找到大量参考资料,建议了许多解决方法和许多可能解决此问题的方法:

    1. 尝试设置 Data Flow Task Delay Validation 属性到 True
    2. 创造另一个 数据流任务 在包中,如果它大于 0 那么优先约束应该导致另一个 数据流任务
    3. 添加一个 File System Task 数据流任务 如果rowcount为 o 您应该设置优先约束表达式以确保这一点。

    参考资料和有用的链接