能否合并两个SSIS包以适配Excel日期列的不同数据类型?
问题
我使用两个独立的SSIS包处理Excel模板数据,分别适配该模板列数据类型的差异。Excel文件布局保持一致,但日期列存在用户输入为日期、常规或文本格式的问题。针对此问题,两个包的Excel源输出列设置如下:Package A的Excel源输出列设为DT_WSTR,Package B的设为Date;SQL Server中对应数据类型为NVARCHAR(255)。请问是否可以合并这两个包,实现SSIS检测到列类型为DT_WSTR时执行Package A,检测到为Date时执行Package B?
回答
当然可以合并成单个包,通过动态检测Excel列的类型来分支执行对应逻辑,具体实现步骤如下:
第一步:添加脚本任务检测日期列类型
在控制流开头加一个脚本任务,读取目标Excel文件日期列的实际类型。可以通过两种方式实现:- 用OLEDB连接Excel,执行
SELECT TOP 0 * FROM [SheetName$],然后读取返回结果集中对应列的DataType属性,判断是否为日期类型; - 用Excel Interop直接访问工作表,读取对应列的
NumberFormat属性,以此推断格式类型。
将检测结果存入SSIS变量(比如@IsColumnDateType,布尔类型),作为后续分支的判断依据。
- 用OLEDB连接Excel,执行
第二步:用优先约束实现分支执行
在控制流中添加两个数据流动任务,分别对应原Package A和Package B的处理逻辑:- 对应Package A的任务:设置优先约束条件为
@IsColumnDateType == False,Excel源输出列设为DT_WSTR,直接映射到SQL的NVARCHAR(255)列; - 对应Package B的任务:设置优先约束条件为
@IsColumnDateType == True,Excel源输出列设为Date,再通过数据转换组件将Date类型转为DT_WSTR,之后映射到SQL的NVARCHAR(255)列(避免日期转字符串时出现格式异常)。
- 对应Package A的任务:设置优先约束条件为
可选优化:统一处理逻辑
其实可以不用分支,直接把Excel源的日期列统一设为DT_WSTR,然后在数据流中添加派生列或脚本组件:尝试将字符串转为日期格式,转换成功则输出格式化后的日期字符串,失败则保留原字符串。这种方式无需检测列类型,直接兼容所有输入格式,实现起来更简单。
内容的提问来源于stack exchange,提问作者DataRookie
相关产品推荐
相关产品推荐

