2011-02-01 70 views
0

這可能是一個複合問題,因爲我可能不完全理解問題。如何將Oracle NUMBER主鍵轉換爲SQL Server Ado.Net消費

我正在從Oracle Apex Query接口中抓取數據並將結果存儲在本地SQL Server實例中,以便本地應用程序可以利用這些數據。

我從中抽取的Oracle數據庫使用定義爲NUMBER數據類型(沒有定義精度或標度)的主鍵。我應該在SQL Server端使用哪種數據類型來存儲Oracle NUMBER字段?

我發現大多數文檔聲明將SQL Server中的NUMBER數據字段作爲Float存儲,但這不是有用的,因爲許多這些NUMBER字段表示主鍵(使用浮點值作爲主鍵一個壞主意)。我已經玩弄在Sql Server中使用DECIMAL(38,38)來存儲Oracle值,但是當您嘗試設置ADO.NET SqlParameter(例如在SqlCommand上)的DECIMAL類型(38,38)時, 38)與一個值,你會得到算術溢出錯誤,因爲它將始終完全擴大SCALE。例如。數字23425將擴展爲23425.00000000000000000000000000000000000000並且會發生溢出錯誤,因爲它已經用完了比SqlParameter的數據類型的精度更多的存儲空間。

+1

SQL服務器中的`decimal(38,38)`是否意味着一個38位數的小數點右邊的數字?所以它永遠不會保持一個大於或等於一個的數字。 – 2011-02-01 19:00:07

+0

+1是的,我希望能夠說明我無法完成的事情,這會讓別人記住如何完成同樣的事情。沒有精度或小數位的Oracle中的數字數據類型就像小數位(38,38),小數位右側的實際位數可能會有所不同。 – wllmsaccnt 2011-02-01 19:15:50

回答

1

在Oracle中,未指定精度或標度時NUMBER爲decimal floating point type.不要與二進制浮點類型混淆。

Oracle還通過指定精度並可選擇縮放到NUMBER來支持十進制固定點,即NUMBER(11,2),這對於將美元值保持爲999,999,999.99美元將是有利的。

SQL Server支持與DECIMAL型和浮點二進制與float and real既不定點小數或浮點二進制數據類型將持有甲骨文十進制浮點型(NUMBER)的所有可能值的SQL Server的固定點小數帶出任何錯誤或信息丟失。

如果正在處理與Oracle數據庫均數字數據在數量上是類型保持而不精度或小數和一些數據是整數值,如代理主密鑰和一些數據是固定點的值,例如作爲美元和其他數據是真正廣泛變化的規模,只需要近似值的保留,那麼你將需要映射的數據類型逐列。

1

正如一個評論,似乎很難相信的值將是什麼,但整數,但他這樣說....

這聽起來像真正的問題是,這是一個整數或浮點數?因爲最簡單的解決方案是將其轉換爲int。

您可以通過在源表上查詢來查看十進制值是否始終爲零,如果是,則爲int。

我不使用甲骨文,但我相信,SQL的正確的味道會是這樣:

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

如果你沒有行,你有一個整數。如果你連一行,他們都使用浮動。

如果由於某些奇怪的原因,他們是浮動的,你仍然可以將它們轉換爲整數。做一個查詢找出最高精度,然後乘以10^x,其中x是最大精度。這再次給你整數。

+0

這並不能解決我的問題,但它是一個很好的評論。我已經構建了一個閱讀器,用於解析oracle的查詢的csv結果,並使用可映射列名稱和數據類型的列映射reolver類將它們映射到SQL類型。如果我挑選哪些NUMBER列的處理方式不同,那麼每次將主鍵添加到架構時,我都必須更新我的代碼/配置。我更期待看看是否存在可用作主鍵的一對一映射。 – wllmsaccnt 2011-02-01 17:42:58

相關問題