When you execute a query to select data from an Oracle-linked server by using OLE DB provider in Microsoft SQL Server 2012 or SQL Server 2014, the values in the NUMBER type column may be truncated in the query result.
This issue occurs because, the Oracle NUMBER type with non-declared precision/scale may not have a clear 1:1 mapping to a SQL Server data type. Before SQL Server 2012 SP2 CU2, SQL Server maps such values to strings to make sure that no loss of precision happens. However, that could lead to incorrect results if the query required sort order on such values. In SQL Server 2012 SP2 CU2, the mapping is changed to numeric (38, 0) to allow for representation of big integer keys which some database schemas are using NUMBER without precision/scale for. This leads to regressions when non-integer values are needed.
After you apply this fix, NUMBER values with unknown precision/scale are treated as double values with OLE DB provider. If the precision is important and the range of the values is not large enough, you can enable the new Trace Flag 7311 that would start treating such values as numeric (38, 10).
The issue was first fixed in the following cumulative update of SQL Server.
Each new cumulative update for SQL Server contains all the hotfixes and all the security fixes that were included with the previous cumulative update. Check out the latest cumulative updates for SQL Server:
To work around this issue, convert the Oracle field from NUMBER type to a data type that is fully supported by SQL Server first.
Microsoft has confirmed that this is a problem in the Microsoft products that are listed in the "Applies to" section.
Third-party information disclaimer
The third-party products that this article discusses are manufactured by companies that are independent of Microsoft. Microsoft makes no warranty, implied or otherwise, about the performance or reliability of these products.