当源数据行数为0时不创建文件

7
在数据流区域中,我有以下内容。我遇到的问题是,即使结果为0,它仍会创建文件。
有人能看出我在这里做错了什么吗?

enter image description here

enter image description here

enter image description here


希望你的问题已经得到解答。如果是这样,请考虑将其标记为已解决。 - Alexander Volok
2个回答

3
这种行为是比较预期的和已知的烦人行为。 即使未选中“第一行包含列名”,SSIS仍会创建一个空的平面文件。
解决方法如下:
  • 如果@RowCountWriteOff=0,在数据流执行后,通过文件系统任务删除此类文件。

  • 另一种替代方案是,如果源中预期的行数为0,则不要启动数据流: enter image description here


更新2019-02-11:

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

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

enter image description here


1
我们又见面了 :) - Hadi
1
有趣的是,我们再次在同一时刻发布了相同的答案 :) - Alexander Volok
感谢您的反馈,Alexander,非常感激。对于没有回复,我深表歉意。过去几天我一直感冒,身体不适。 - Philip
嗨@AlexanderVolok - “表达式任务”应该包含什么内容? - Philip
该表达式任务只是一个入口点,用于创建一个条件约束到一个真正的清理任务。您可以在该任务中放置一些虚拟表达式,例如 1 == 1 - Alexander Volok
显示剩余3条评论

2

更新1 - 根据OP的评论添加更多细节

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

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

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


最初的回答

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

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

参考和有用链接


谢谢。我的问题是数据流中有13个导出到CSV的命令,它们是昂贵的查询。你对最佳解决方案有什么建议吗? - Philip
如果可能的话,使用for each循环容器来循环查询。在数据流任务之前执行一个select count SQL任务。 - Hadi
如果计数大于0,则执行数据流。 - Hadi
@Philip 或许我会稍后更新答案并提供更多细节。 - Hadi
@Philip,我添加了更多细节,请查看。 - Hadi
感谢您的反馈,@Hadi,非常感激。对于没有回应,我深表歉意。过去几天我一直感冒,身体不适。 - Philip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接