源有0行时不创建文件

时间:2019-02-10 05:40:36

标签: sql-server ssis etl flat-file flatfiledestination

我在“数据流”区域中包含以下内容。我遇到的问题是,即使结果为0,它仍在创建文件。

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

enter image description here

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:2)

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

基于您的评论,我将假定您要使用SQL命令遍历许多表,检查表是否包含行,如果是,则应将行导出到平面文件,否则应忽略表。我将提到实现该目标所需的步骤,并提供包含每个步骤更多详细信息的链接。

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

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


初始答案

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

  1. 尝试将Data Flow Task Delay Validation属性设置为True
  2. 在包中创建另一个Data Flow Task,该列表仅用于计数源中的行,如果它大于0,则优先级约束应导致另一个Data Flow Task
  3. File System Task之后添加Data Flow Task,如果RowCount为o,则会删除输出文件,您应该设置优先级约束表达式来确保。

参考和有用的链接

答案 1 :(得分:2)

这是非常令人期待和已知的令人讨厌的行为。 即使未选中,SSIS也会创建一个空的平面文件:“第一个数据行中的列名”。

解决方法是:

  • 如果@RowCountWriteOff = 0在执行数据流之后立即通过文件系统任务删除该文件。

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


更新2019-02-11:

  

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

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

enter image description here