SQL Server:Openquery到Oracle:数字/数字的数据类型

问题描述:

在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

你必须明确地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') 

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