SSIS包条件拆分异常:执行时同时生成空文件与数据文件排查
问题分析与解决方案
问题根源
你的问题出在对SSIS中条件拆分组件的作用理解偏差,以及SSIS文件目标的执行机制上:
- 条件拆分是行级判断:它的作用是对数据流中每一行数据进行分支筛选,而不是控制整个数据流任务是否执行某个分支的文件生成。你用变量
@[User::X]作为条件,本质是把变量值和每一行数据(如果存在的话)做比较,但这完全不是你想要的“根据总计数决定生成哪个文件”的逻辑。 - 文件目标的预创建机制:SSIS的文件目标组件(比如平面文件目标),只要它所属的数据流任务被执行,不管有没有数据流入,都会预先创建对应的文件。所以哪怕
@[User::X]为0时OLE DB源没有数据输出,两个文件目标对应的分支只要在数据流里存在,就会自动创建空文件;当@[User::X]大于0时,有数据的分支写入内容,另一个分支虽然没数据,但文件已经被创建出来了,最终导致两个文件同时存在。
正确解决方案
应该在控制流层面做分支判断,而不是在数据流里用条件拆分:
- 保留你现有的“执行SQL任务”,用来获取
count(*)到变量@[User::X],这一步是正确的。 - 在控制流中,从执行SQL任务引出两条优先约束,分别指向两个独立的数据流任务:
- 第一条优先约束的条件设置为
@[User::X] > 0,对应的数据流任务只做简单的“OLE DB源(执行select * from table1)→ 文件目标(生成包含数据的文件)”。 - 第二条优先约束的条件设置为
@[User::X] == 0,对应的数据流任务专门用来生成空文件:你可以用一个脚本源输出空结果集,或者用OLE DB源执行select top 0 * from table1,然后连接到文件目标,这样执行时就会创建一个空文件。
- 第一条优先约束的条件设置为
- 这样每次只会触发其中一个数据流任务,只会生成对应的一个文件,不会出现两个文件同时创建的情况。
额外注意事项
- 如果需要确保文件是全新的,记得在文件目标的设置中勾选“覆盖现有文件”选项,避免残留之前的文件。
- 不要试图在同一个数据流里用条件拆分来实现这个需求,不仅逻辑混乱,还会触发文件预创建的问题,控制流分支是最清晰高效的方式。
内容的提问来源于stack exchange,提问作者Harshitha Kumar
相关产品推荐
相关产品推荐

