2015-02-09 58 views
0

在SQL Server 2012 SP2上,我使用Oracle 9/10/11的OPENQUERY。一般來說,我處理整數,現在我們有一些處理浮點數的OPENQUERY。這些值存儲在數據類型爲number()的列中。在SQL Servre中,有效數字將被截斷。在SQL Server中,這些列被處理爲NUMERIC(38,0)SQL Server:Openquery到Oracle:數字/數字的數據類型

我可以在數據庫或鏈接服務器的設置中更改此數據類型處理嗎?或者,最好的做法是避免這種誤解,通常在將數字轉換爲字符之前將其轉換爲字符,然後再從Oracle轉移到SQL Server?

一個例子,我在Oracle中創建一個表:

CREATE TABLE oratab 
(
     num_col1 number , num_col2 number(10, 5) , 
     flo_col1 FLOAT , flo_col2 FLOAT(5) 
); 

INSERT INTO oratab (num_col1, num_col2, flo_col1, flo_col2) 
VALUES (3.1415, 3.1415, 3.1415, 3.1415); 

SELECT 
    num_col1, num_col2, num_col3, flo_col1, flo_col2 
FROM oratab; 

正如所預期的結果是:

NUM_COL1 | NUM_COL2 | FLO_COL1 | FLO_COL2 
------------------------------------------ 
3.1415 | 3.1415 | 3.1415 | 3.142 

當我就這個表中選擇從SQL Server

SELECT 
    num_col1, num_col2, flo_col1, flo_col2 
FROM 
    OPENQUERY (ORADB, 'SELECT num_col1, num_col2, flo_col1, flo_col2 FROM oratab') 

我收到以下結果:

NUM_COL1 | NUM_COL2 | FLO_COL1 | FLO_COL2 
------------------------------------------ 
    3 | 3,14150 | 3.1415 | 3.142 

當我轉換的數值數據爲char我會得到預期的結果

SELECT num_col1 
FROM OPENQUERY (ORADB, 'SELECT to_char(num_col1) FROM oratab') 

當我運行一個SELECT INTO從這個OPENQUERY,SQL Server創建的數據類型NUMERIC(38,0)num_col1

回答

1

你必須明確地CAST所需精度:

SELECT 
    num_col1, 
    cast(num_col2 as number(10,5)) as num_col2, 
    flo_col1, 
    cast(flo_col2 as float(5)) as flo_col2 
FROM OPENQUERY (ORADB, 'SELECT num_col1, num_col2, flo_col1, flo_col2 FROM oratab') 
0
SELECT * 
FROM OPENQUERY (ORADB, 'SELECT to_char(num_col1), num_col2, flo_col1, flo_col2 FROM oratab') 
相關問題