使用SSIS迁移MySQL至SQL Server遇类型溢出转换错误求助
问题原因分析
MySQL的timestamp类型允许存储0000-00-00 00:00:00这种"零日期"值,但SQL Server的DATETIME类型有效范围是1753-01-01 00:00:00到9999-12-31 23:59:59.997。当SSIS尝试把0000-00-00 00:00:00转换为SQL Server的DATETIME时,因为该值超出目标类型范围,直接触发"数据值溢出指定类型"的错误。
解决思路
方案1:在MySQL源端预处理零日期
读取数据时直接替换或转换零日期,避免后续报错:
- 写源查询时用MySQL函数处理:
SELECT -- 其他字段 CASE WHEN update_at = '0000-00-00 00:00:00' THEN '1753-01-01 00:00:00' ELSE update_at END AS update_at FROM your_source_table; - 或者修改MySQL连接字符串,添加
zeroDateTimeBehavior=convertToNull参数,把零日期转成NULL,之后在SSIS里把NULL替换成SQL Server支持的日期值:
连接字符串示例:Server=xxx;Database=xxx;Uid=xxx;Pwd=xxx;zeroDateTimeBehavior=convertToNull;
方案2:调整SQL Server目标列类型
如果业务允许,换用支持更早日期的类型:
- 改用
DATETIME2:它的范围是0001-01-01到9999-12-31,虽然还是不支持0000-00-00,但可以把零日期转成0001-01-01来适配; - 把目标列设为
DATETIME NULL,配合连接字符串的zeroDateTimeBehavior=convertToNull参数,直接把零日期存为NULL(需确认业务接受NULL值)。
方案3:在SSIS数据流中处理异常值
用派生列组件在数据流中间修正日期:
- 在源组件和目标组件之间添加派生列组件;
- 新建派生列(替换原
update_at列),用表达式判断并替换:[update_at] == (DT_DBTIMESTAMP)"0000-00-00 00:00:00" ? (DT_DBTIMESTAMP)"1753-01-01 00:00:00" : [update_at] - 把派生列的输出连接到OLE DB目标,映射处理后的列。
方案4:检查SSIS类型映射
确认源列到目标列的类型映射是否正确:
- MySQL的
timestamp在SSIS里应映射为DT_DBTIMESTAMP,SQL Server的DATETIME也对应DT_DBTIMESTAMP,避免自动映射选到错误类型(比如DT_DATE)导致额外转换错误。
内容的提问来源于stack exchange,提问作者Eddy
相关产品推荐
相关产品推荐

