症状
当使用 Microsoft SQL Server 2012 或 SQL Server 2014 中的 OLE DB 访问接口从 Oracle 链接服务器中执行查询以选择数据时,查询结果中的 "数字类型" 列中的值可能会被截断。
原因
出现此问题的原因是,具有非声明精度/小数位数的 Oracle 数字类型可能不会将明文1:1 映射到 SQL Server 数据类型。 在 SQL Server 2012 SP2 CU2 之前,SQL Server 将此类值映射到字符串,以确保不会发生精度损失。 但是,如果查询所需的排序顺序在此类值上,这可能会导致不正确的结果。 在 SQL Server 2012 SP2 CU2 中,将映射更改为数字(38,0),以允许对某些数据库架构使用数字而不是精度/小数位数的大整数键的表示形式。 这会在需要非整数值时导致回归。
解决方案
应用此修补程序后,具有未知精度/小数位数的数字值将被视为使用 OLE DB 提供程序的双倍值。 如果精度很重要且值的范围不够大,则可以启用新的跟踪标记7314,该标记将开始将此类值视为数字(38,10)。
在 SQL Server 的以下累积更新中,此问题首先已修复。
SQL Server 2014 SP1 的累积更新1 /en-us/help/3067839
SQL Server 2014 的累积更新8 /en-us/help/3067836
SQL Server 2012 SP2 的累积更新6 /en-us/help/3052468
SQL Server 的每个新的累积更新均包含以前的累积更新中包含的所有修补程序和所有安全修补程序。 查看 SQL Server 的最新累积更新:
解决方法
若要解决此问题,请将 Oracle 字段从 NUMBER 类型转换为 SQL Server 首先完全支持的数据类型。
状态
Microsoft 已经确认这是一个列于“适用范围”部分的 Microsoft 产品问题。
本文中提到的第三方产品由 Microsoft 以外的其他公司提供。 对于这些产品的性能或可靠性,Microsoft 不做任何暗示保证或其他形式的保证。