7

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

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

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

4

2 回答 2

3

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

解决方法是:

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

  • 作为替代方案,如果源中的预期行数为 0,则不要启动数据流: 在此处输入图像描述


2019-02-11 更新:

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

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

在此处输入图像描述

于 2019-02-10T09:08:20.257 回答
2

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

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

  1. 首先,您应该创建一个Foreach 循环容器来循环表
  2. 您应该添加一个Execute SQL Task带有计数的命令SELECT COunt(*) FROM ....)并将结果集存储在一个变量中
  3. 添加将数据从 OLEDB 源导入到平面文件目标的数据流任务。
  4. 之后,您应该使用表达式向数据流任务添加优先约束,表达式类似于@[User::RowCount] > 0

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


初步答案

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

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

参考资料和有用的链接

于 2019-02-10T09:07:57.440 回答