如何将Oracle NUMBER主键转换为SQL Server以实现Ado.Net消费

时间:2011-02-01 17:16:50

标签: sql-server oracle ado.net

这可能是一个复合问题,因为我可能不完全理解这个问题。

我正在从Oracle Apex Query接口抓取数据并将结果存储在本地SQL Server实例中,以便本地应用程序可以利用这些数据。

我提取的Oracle数据库使用定义为NUMBER数据类型的主键(未定义精度或比例)。我应该在SQL Server端使用什么数据类型来存储Oracle NUMBER字段?

我发现的大多数文档都声明将SQL Server中的NUMBER数据字段存储为Float,但这没有用,因为这些NUMBER字段中的许多字段代表主键(使用浮点值作为主键是坏主意)。

我曾在Sql Server中使用DECIMAL(38,38)来存储Oracle值,但是当您尝试使用DECIMAL类型设置ADO.NET SqlParameter(例如在SqlCommand上)时(38,38) )使用值,您将获得算术溢出错误,因为它将始终完全扩展SCALE。例如。数字23425将扩展为23425.00000000000000000000000000000000000000并且会产生溢出错误,因为它占用的存储空间超过了SqlParameter数据类型精度中的可用存储空间。

2 个答案:

答案 0 :(得分:1)

正如评论一样,似乎很难相信这些价值观只不过是整数,但随之而来......

听起来真正的问题是,这是一个int还是一个浮点数?因为最简单的解决方案是将其转换为int。

您可以通过对源表执行查询来查看十进制值是否始终为零,如果是,则为int。

我不使用Oracle,但我相信SQL的正确风格是这样的:

select id_column
  from theTable
 where id_column - trunc(id_column,0) <> 0
   and rownum <= 1

如果没有行,则表示整数。如果你连一排,他们就会使用花车。

如果由于一些奇怪的原因它们是浮子,你仍然可以将它们转换为整数。执行查询以找出最高精度,然后乘以10 ^ x,其中x是最大精度。这会让你再次注意。

答案 1 :(得分:1)

在Oracle中,如果未指定精度或比例,则NUMBER为decimal floating point type.不要与二进制浮点类型混淆。

Oracle还通过指定精度支持小数定点,并可选择缩放到NUMBER,即NUMBER(11,2),这样可以将美元价值保持在999,999,999.99美元。

SQL Server支持带DECIMAL类型的定点十进制和带float and real的浮点二进制文件SQL Server定点十进制或浮点二进制数据类型都不会包含所有可能的Oracles十进制浮点值输入错误或丢失信息时输入(NUMBER)。

如果您正在处理Oracle数据库,则所有数字数据都保持为NUMBER类型而没有精度或比例,而某些数据是整数值,例如代理主键和一些数据< / strong>是固定点值,例如美元和其他数据在规模上真正变化很大,只需要保持近似值,那么您需要逐列地映射数据类型。