如何在SSIS中获取首尾记录并解决Union All数据类型问题
SSIS流程问题分析与修正方案
核心问题:Union All报错原因
你当前Union All无法配置的根本原因是三个输入分支的列结构完全不匹配:第一个分支仅输出年份相关列,第二个仅输出起始日期,第三个仅输出结束日期。Union All要求所有输入的列数、数据类型、顺序必须严格对应,这种单字段分支自然无法合并。
现有流程的冗余与错误点
- 多余的日期转换操作:在Aggregate取最小/最大日期后,你将date类型拆分为日/月/年字符串再拼接,随后又转回date类型——这完全没必要。Aggregate直接输出的
MIN(ConvertedDate)和MAX(ConvertedDate)本身就是标准date类型,完全匹配目标表字段,且你最后一个公式里的*属于语法错误,会导致类型异常。 - 年份处理逻辑冗余:你需要的
Season_Year是固定值2019,无需从日期字段推导,直接生成常量列即可。 - Union All使用场景错误:Union All用于合并同结构的数据集(比如多个文件的同格式数据),不是用来将三个单字段结果拼接为一行多列数据的。
修正后的最简流程(适配你的SSIS版本)
单文件处理流程
- Flat File Source:读取文件时,在Flat File Connection Manager中将日期列的格式设为
dd/MM/yyyy,确保源日期字符串识别正确。 - Data Conversion:将源日期字符串转换为
date类型,命名为ConvertedDate。 - Aggregate:
- 不设置任何
Group By列(全局聚合) - 添加两个聚合列:
- 名称:
Season_Start,操作选Min,源列选ConvertedDate(自动取数据集最早日期,即你需要的2019年首条记录) - 名称:
Season_end,操作选Max,源列选ConvertedDate(自动取数据集最晚日期,即26/07/2020)
- 名称:
- 不设置任何
- 派生列:添加常量列
Season_Year,表达式写2019,数据类型设为DT_I4(对应目标表的int类型)。 - OLEDB Destination:直接将三列映射到目标表的
Season_Year、Season_Start、Season_end字段即可。
多文件批量处理(5个文件)
在上述单文件流程外层套一个Foreach Loop Container,遍历所有5个平面文件,每个文件生成一行结果,最后用Union All合并所有文件的结果,再写入OLEDB Destination。
特殊情况适配(需确保Season_Start为2019年数据)
如果源文件可能包含2019年之前的日期,需在Data Conversion后添加Conditional Split:
- 分支1:过滤条件
YEAR(ConvertedDate) == 2019,后续Aggregate取MIN(ConvertedDate)作为Season_Start - 分支2:直接Aggregate取
MAX(ConvertedDate)作为Season_end - 用Merge Join(选择Full Outer Join,两个分支均为单行数据)合并两个分支的结果,再添加
Season_Year常量列,最后写入目标表。
内容的提问来源于stack exchange,提问作者StAndrews
相关产品推荐
相关产品推荐

