当源有 0 行时不创建文件
Not Creating the File when source has 0 rows
我在数据流区域中有以下内容。我遇到的问题是,即使结果为 0,它仍在创建文件。
谁能看出我做错了什么?
更新 1 - 根据 OP 评论添加更多详细信息
根据您的评论,我假设您想使用 SQL 命令遍历许多 tables,检查 table 是否包含行,如果是那么你应该将行导出到平面文件,否则你应该忽略 tables。我将提及实现该目标所需的步骤,并提供包含每个步骤的更多详细信息的链接。
- 首先你应该创建一个 Foreach Loop container to loop over tables
- 您应该使用计数命令
SELECT COunt(*) FROM ....)
和 store the Resultset inside a variable 添加一个 Execute SQL Task
- 添加数据流任务,将数据从 OLEDB 源导入到平面文件目标。
- 之后你应该add a precedence constraint with expression,到数据流任务,表达式类似于
@[User::RowCount] > 0
此外,最好查看我提供的链接,因为它们包含很多有用的信息和分步指南。
初始答案
防止 SSIS 创建空平面文件是一个常见问题,您可以在网上找到很多参考资料,建议的解决方法和解决问题的方法很多:
- 尝试将
Data Flow Task
Delay Validation
属性 设置为 True
- 在包内创建另一个
Data Flow Task
,它将仅用于计算Source中的行数,如果它大于0
那么优先约束应该导致另一个Data Flow Task
- 在删除输出文件的
Data Flow Task
后添加File System Task
,如果RowCount为o
,需要设置优先约束表达式来保证。
参考资料和有用的链接
- How to prevent SSIS package creating empty flat file at the destination
- Prevent SSIS from creating an empty flat file
- Eliminating Empty Output Files in SSIS
- Prevent SSIS for creating an empty csv file at destination
- Check for number of rows returned and do not create empty destination file
- 将
Data Flow Task
Delay Validation
属性设为True
这是意料之中且众所周知的恼人行为。
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
事件处理程序,以便将清理逻辑隔离到某些特定数据流:
我在数据流区域中有以下内容。我遇到的问题是,即使结果为 0,它仍在创建文件。
谁能看出我做错了什么?
更新 1 - 根据 OP 评论添加更多详细信息
根据您的评论,我假设您想使用 SQL 命令遍历许多 tables,检查 table 是否包含行,如果是那么你应该将行导出到平面文件,否则你应该忽略 tables。我将提及实现该目标所需的步骤,并提供包含每个步骤的更多详细信息的链接。
- 首先你应该创建一个 Foreach Loop container to loop over tables
- 您应该使用计数命令
SELECT COunt(*) FROM ....)
和 store the Resultset inside a variable 添加一个 - 添加数据流任务,将数据从 OLEDB 源导入到平面文件目标。
- 之后你应该add a precedence constraint with expression,到数据流任务,表达式类似于
@[User::RowCount] > 0
Execute SQL Task
此外,最好查看我提供的链接,因为它们包含很多有用的信息和分步指南。
初始答案
防止 SSIS 创建空平面文件是一个常见问题,您可以在网上找到很多参考资料,建议的解决方法和解决问题的方法很多:
- 尝试将
Data Flow Task
Delay Validation
属性 设置为True
- 在包内创建另一个
Data Flow Task
,它将仅用于计算Source中的行数,如果它大于0
那么优先约束应该导致另一个Data Flow Task
- 在删除输出文件的
Data Flow Task
后添加File System Task
,如果RowCount为o
,需要设置优先约束表达式来保证。
参考资料和有用的链接
- How to prevent SSIS package creating empty flat file at the destination
- Prevent SSIS from creating an empty flat file
- Eliminating Empty Output Files in SSIS
- Prevent SSIS for creating an empty csv file at destination
- Check for number of rows returned and do not create empty destination file
- 将
Data Flow Task
Delay Validation
属性设为True
这是意料之中且众所周知的恼人行为。 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
事件处理程序,以便将清理逻辑隔离到某些特定数据流: