使用SSDT迁移SSIS包时如何避免数据类型变更
解决SSIS 2003迁移至2016时OLE DB Source数据类型变更问题
在从SQL Server 2003迁移SSIS包到2016的过程中,OLE DB Source数据类型自动变更的问题很常见——主要是新旧版本SSIS的元数据检测机制、OLE DB驱动兼容性以及SQL Server数据类型映射规则的差异导致的。以下是几个可靠的解决方法,帮你强制保留原数据类型:
1. 手动锁定OLE DB Source的元数据
这是最直接的办法,通过SSDT手动指定每个列的数据类型和长度,完全匹配原2003包的设置:
- 打开OLE DB Source编辑器,切换到Columns选项卡,确认选中所有需要保留的列。
- 切换到Advanced选项卡,逐个查看每个输出列的
DataType和Length属性。 - 将每个列的属性修改为原2003包中的对应值(可以参考原2003包设计界面导出的元数据,或直接对比原包的.dtsx文件内容)。
- 修改完成后保存包,后续打开时尽量避免触发“自动检测元数据”的操作。
2. 使用兼容的OLE DB驱动
SSIS 2016默认使用较新的OLE DB驱动(如Microsoft OLE DB Driver for SQL Server),而2003版本的包依赖旧版驱动(如SQL OLE DB Provider),驱动差异会导致类型映射不一致:
- 在SSDT的连接管理器中,创建新的OLE DB连接时,选择与原2003包相同的驱动(比如
SQL Server Native Client 9.0或更旧的Microsoft OLE DB Provider for SQL Server)。 - 用这个旧驱动连接非生产数据库,重新配置OLE DB Source,此时数据类型映射会更贴近原2003包的设置。
- 注意:旧驱动在2016环境中仍可使用,但建议先做兼容性测试,避免运行时出现异常。
3. 直接编辑.dtsx文件的XML元数据
如果需要修改的列很多,手动调整效率低,可以直接编辑.dtsx文件的XML内容:
- 右键SSIS包,选择View Code,打开XML编辑界面。
- 搜索
<DTS:OutputColumn>节点,找到对应OLE DB Source的输出列定义。 - 修改每个列的
DataType和Length属性值,确保与原2003包的元数据一致(比如原包中varchar(50),就设置DataType="129"、Length="50")。 - 修改前务必备份.dtsx文件,避免XML格式错误导致包损坏。
4. 使用SSIS迁移助手(SSMA)简化迁移流程
微软官方的SQL Server Migration Assistant(SSMA)针对SSIS包迁移做了优化,能自动保留大部分原有的元数据设置:
- 下载并安装SSMA for SSIS,按照向导导入2003的DTS/SSIS包。
- 迁移过程中,SSMA会自动处理数据类型映射,尽量保持原包的设置。
- 完成迁移后,再将包导入SSDT 2016进行微调,相比手动导入能减少很多类型变更的问题。
另外需要注意:确保你的非生产数据库表结构与原2003生产库完全一致,如果结构有差异,OLE DB Source会自动读取当前库的元数据,导致类型变化。如果非生产库结构不同,建议先同步结构再进行包的迁移测试。
内容的提问来源于stack exchange,提问作者M06H
相关产品推荐
相关产品推荐

