SSMA for Oracle中Oracle Date转TSQL datetime2(7)报错求助
Oracle Date转SQL Server datetime2(7)的SSMA迁移错误排查方案
报错信息
字符串值被截断,因为目标列长度小于字符串长度。数据源中类型为OracleDate的值无法转换为指定目标列的datetime2类型。
排查与解决步骤
校验Oracle端实际数据
不要只看字段类型,重点检查数据内容:- 执行Oracle查询查看日期的完整格式:
SELECT your_date_col, TO_CHAR(your_date_col, 'YYYY-MM-DD HH24:MI:SS.FF') FROM problem_table WHERE ROWNUM <= 200; - 排查是否存在超出SQL Server datetime2范围的值(datetime2支持范围是
0001-01-01到9999-12-31,Oracle Date支持公元前4712年),或是存在格式异常的脏数据。
- 执行Oracle查询查看日期的完整格式:
检查SSMA类型映射规则
- 全局规则:打开
工具>项目设置>类型映射,确认Oracle Date对应的目标类型是datetime2(7),没有被错误修改。 - 列级规则:右键问题表的目标列,查看
类型映射,确认没有单独设置错误的目标类型(比如误设为datetime而非datetime2(7))。
- 全局规则:打开
调整批量迁移参数
批量迁移时的资源竞争可能导致错误提示偏差:- 进入
工具>项目设置>迁移>数据迁移,将批量插入行数从默认值调小(比如改成50或100),减少单批次数据量。
- 进入
单独处理顽固表
- 用
DBMS_STATS.GATHER_TABLE_STATS('schema_name', 'problem_table');收集表统计信息,排查是否存在损坏的数据行。 - 使用SSMA的
数据迁移预览功能,定位到具体触发错误的数据行,针对性修正后再迁移。 - 若数据量小,可导出为CSV文件,用SQL Server的
BULK INSERT命令手动导入,对比SSMA迁移结果。
- 用
升级SSMA版本
旧版SSMA存在Oracle Date与datetime2的兼容性bug,下载安装最新版的SSMA for Oracle,修复已知的转换问题。
内容的提问来源于stack exchange,提问作者Steve88657w
相关产品推荐
相关产品推荐

