程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL Server 2005與Oracle同步 注意NUMBER類型轉換

SQL Server 2005與Oracle同步 注意NUMBER類型轉換

編輯:關於SqlServer

在前面的文章中我已經講到使用同義詞的方法來在SQL Server 2005下連接Oracle,我們可以使用同義 詞在SQL Server 2005下連接Oracle來實時訪問Oracle數據庫,但是如果Oracle中的表數據流較大則會影 響應用系統的性能,於是應采用數據庫作業每天定時執行:

drop table abc--刪除舊表
go
select * into abc
from aaa--aaa為同義詞

from aaa--aaa為同義詞這樣就可以把Oracle中的數據同步到本地的SQL Server數據庫中。從而解決跨 實例查詢的性能問題。

使用這樣的方式半年了都沒有發現有什麼問題,可是最近卻發現了一個現象,在Oracle中有一個表aaa ,其中一個字段BILL NUMBER類型(未指定精度和小數數據位),對於這種類型,SQL Server2005中同步的 表abc中卻被定義為nvarchar(384)的類型!?明明是一個數字類型為什麼SQL Server會將其轉換為字符串類 型呢?

若只是數據類型改變了倒沒有什麼,我應用程序在處理時轉換一下就是了,但是更奇怪的是其中某些 數據在Oracle中查出來是12.34567,但是在SQL Server 2005中查出來卻成了 12.345670543574563452346547546234234543656434...,後面是幾十位的小數,簡直神奇了!有一行數據 在Oracle中是1,而在SQL Server中查出來是0.99999999999999999999999999999999...但是這種數據也很 少發生,在數萬條數據中可以找到2-3條這種幾十位小數的數據。

正是這種數據的存在使得應用程序有時算出來的結果和Oracle那邊的系統算出來的結果無法匹配。

經測試,如果Oracle中指定了NUMBER類型的精度和小數位數比如NUMBER(15)這樣SQL Server將可以自 動將其轉換為numeric(15,0)類型。

由於NUMBER類型可以表示1.0 * 10(-130) —— 9.9...9 * 10(125) {38個9後邊帶88個0} 之間的數據,精確度可以達到小數點後38位小數,由於SQL Server中沒有如此高精度的數據類型,所以在 沒有指定NUMBER精度和小數位的情況下SQL Server會將其轉換為字符串類型以滿足長度和精度的需要。

解決辦法就是將SQL Server中同步表的nvarchar(384)類型修改為decimal類型或numeric類型,同步時 不刪除表,只是清除表內容,然後插入數據。同步SQL為:

TRUNCATE TABLE abc--清除表abc內容
go
insert into abc--將同義詞aaa中的數據插入abc表
select *
from aaa

這樣問題是解決了,但是造成兩邊查詢出的數據不相同的原因是什麼呢?這個我還不知道。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved