为什么SQL Server OPENQUERY to Oracle 在SQL Server 2016 到2008 上返回不同的列类型

Gav*_*vin 3 oracle sql-server odbc linked-server

我在同一台机器上有两个 SQL Server 实例,一个是 2008 年,一个是 2016 年。两个实例都有一个链接服务器连接到同一个 Oracle 12 服务器。

如果我运行以下查询,2008 年将 1.23 作为 VARCHAR 返回,但 2016 年将其作为浮点数返回

SELECT * INTO #tst FROM OPENQUERY(JOHPROD,'SELECT 1.23 FROM dual')
SELECT t.Name,* FROM tempdb.sys.columns c
    INNER JOIN sys.types t ON t.system_type_id = c.system_type_id
WHERE [object_id] = OBJECT_ID(N'tempdb..#tst');
Run Code Online (Sandbox Code Playgroud)

变量类型

在此处输入图片说明

两个实例都指向同一个 Oracle 服务器,并且都使用同一个 Oracle ODBC 驱动程序。

两个链接服务器都具有相同的定义...

EXEC master.dbo.sp_addlinkedserver @server = N'ORAPROD', @srvproduct=N'Oracle', @provider=N'OraOLEDB.Oracle', @datasrc=N'ORAPROD'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'ORAPROD',@useself=N'False',@locallogin=NULL,@rmtuser=N'ORAUSER',@rmtpassword='########'
GO
EXEC master.dbo.sp_serveroption @server=N'ORAPROD', @optname=N'collation compatible', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORAPROD', @optname=N'data access', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'ORAPROD', @optname=N'dist', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORAPROD', @optname=N'pub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORAPROD', @optname=N'rpc', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORAPROD', @optname=N'rpc out', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORAPROD', @optname=N'sub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORAPROD', @optname=N'connect timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'ORAPROD', @optname=N'collation name', @optvalue=NULL
GO
EXEC master.dbo.sp_serveroption @server=N'ORAPROD', @optname=N'lazy schema validation', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORAPROD', @optname=N'query timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'ORAPROD', @optname=N'use remote collation', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'ORAPROD', @optname=N'remote proc transaction promotion', @optvalue=N'true'
GO
Run Code Online (Sandbox Code Playgroud)

知道为什么这些会返回不同的类型吗?

Tom*_*m V 6

此行为在最近的更新中已更改。请参阅 修复:当您使用 OLE DB 提供程序从 Oracle 链接的服务器中选择数据时,NUMBER 类型的值被截断

应用此修复程序后,具有未知精度/小数位数的 NUMBER 值将被视为使用 OLE DB 提供程序的双精度值。如果精度很重要并且值的范围不够大,您可以启用新的跟踪标志 7314,它将开始将此类值视为数字 (38, 10)。

但是,我有点惊讶您得到float的是double\而不是\numeric因为这似乎与文章有些矛盾,所以我不确定它是否解释了您的确切情况。