【问题标题】:Not Creating the File when source has 0 rows源有 0 行时不创建文件
【发布时间】:2019-07-03 22:50:57
【问题描述】:

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

谁能看到我在这里做错了什么?

【问题讨论】:

  • 希望您的问题得到解答。如果是这样,您是否可以考虑将其标记为此类。

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


【解决方案1】:

这几乎是预期和已知的烦人行为。 SSIS 将创建一个空的平面文件,即使未选中:“第一个数据行中的列名”。

解决方法是:

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

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


2019 年 2 月 11 日更新:

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

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

【讨论】:

  • 我们又见面了:)
  • 有趣,我们又在同一时间发布了相同的答案:)
  • 谢谢。我遇到的问题是,我在数据流中有 13 个导出到 csv 命令,它们是昂贵的查询。对这里的最佳方法有什么建议吗?
  • 然后对空文件运行加载后删除。您可以将执行后事件与文件系统任务挂钩。
  • 感谢您的反馈,Alexander,非常感谢,并为没有回复而道歉。过去几天我感冒了,感觉不舒服。
【解决方案2】:

更新 1 - 基于 OP cmets 添加更多详细信息

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

  1. 首先你应该创建一个Foreach Loop container to loop over tables
  2. 您应该添加一个带有计数命令SELECT COunt(*) FROM ....)store the Resultset inside a variableExecute SQL Task
  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. Data Flow Task之后添加File System Task,如果RowCount为o,则删除输出文件,您应该设置优先约束表达式以确保这一点。

参考和有用的链接

【讨论】:

  • 谢谢。我遇到的问题是,我在数据流中有 13 个导出到 csv 命令,它们是昂贵的查询。对这里的最佳方法有什么建议吗?
  • 如果可能,使用 for eachloop contqiner 循环查询。并在数据流任务之前执行一个 select count sql tsak
  • 如果 count > 0 执行数据流
  • @Philip 也许我会在一段时间内更新答案并提供更多详细信息
  • @Philip 我添加了更多详细信息,请查看
猜你喜欢
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 2015-10-18
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多