2015-02-09 2 views
0

На SQL Server 2012 с пакетом обновления 2 (SP2) я использую OPENQUERY для Oracle 9/10/11. В общем, я имел дело с целыми числами, теперь у нас есть OPENQUERY, которые адресуют плавающие числа. Значения хранятся в столбцах с типом данных number(). В SQL Servre значимые цифры будут усечены. В SQL Server эти столбцы обрабатываются как NUMERIC(38,0).SQL Server: Openquery to 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 

Когда я преобразовать числовые данные в обугливаюсь я получить ожидаемый результат

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

Когда я бег избранного в от этого OPENQUERY, SQL Server создает столбец num_col1 с типом NUMERIC(38,0) данных.

ответ

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')