当源有 0 行时不创建文件

Not Creating the File when source has 0 rows

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

谁能看出我做错了什么?

更新 1 - 根据 OP 评论添加更多详细信息

根据您的评论,我假设您想使用 SQL 命令遍历许多 tables,检查 table 是否包含行,如果是那么你应该将行导出到平面文件,否则你应该忽略 tables。我将提及实现该目标所需的步骤,并提供包含每个步骤的更多详细信息的链接。

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

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


初始答案

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

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

参考资料和有用的链接

这是意料之中且众所周知的恼人行为。 SSIS 将创建一个空的平面文件,即使未选中也是如此:"column names in a first data row".

解决方法是:

  • 如果 @RowCountWriteOff = 0 刚好在数据流执行之后,通过文件系统任务删除此类文件。

  • 作为替代方案,如果源中的预期行数为 0,则不要启动数据流:


2019-02-11更新:

Issue I have is that I have 13 of these export to csv commands in the data flow and they are costly queries

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