SQL 服务器:对 Oracle 的 Openquery:number/numeric 的数据类型
SQL Server : Openquery to Oracle: Data type for number/numeric
在 SQL Server 2012 SP2 上,我使用 OPENQUERY
到 Oracle 9/10/11。通常我处理整数,现在我们有一些 OPENQUERY
来处理浮点数。这些值存储在数据类型为 number()
的列中。在 SQL Servre 中,有效数字将被 t运行 处理。在 SQL 服务器中,此列被处理为 NUMERIC(38,0)
。
我可以在数据库或链接服务器的设置中更改这种数据类型处理吗?还是通过在从 Oracle 传输到 SQL 服务器之前通常将数字转换为字符来避免这种误解的最佳做法?
我在 Oracle 中创建一个 table 的例子:
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 服务器
在此 table 上创建 select
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')
当我 运行 从这个 OPENQUERY
进入 select 时,SQL 服务器创建数据类型为 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')
在 SQL Server 2012 SP2 上,我使用 OPENQUERY
到 Oracle 9/10/11。通常我处理整数,现在我们有一些 OPENQUERY
来处理浮点数。这些值存储在数据类型为 number()
的列中。在 SQL Servre 中,有效数字将被 t运行 处理。在 SQL 服务器中,此列被处理为 NUMERIC(38,0)
。
我可以在数据库或链接服务器的设置中更改这种数据类型处理吗?还是通过在从 Oracle 传输到 SQL 服务器之前通常将数字转换为字符来避免这种误解的最佳做法?
我在 Oracle 中创建一个 table 的例子:
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 服务器
在此 table 上创建 selectSELECT
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')
当我 运行 从这个 OPENQUERY
进入 select 时,SQL 服务器创建数据类型为 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')