Sql-Server

為什麼 SQL Server OPENQUERY To Oracle 在 SQL Server 2016 到 2008 上返回不同的列類型

  • April 18, 2019

我在同一台機器上有兩個 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');

變數類型

在此處輸入圖像描述

兩個實例都指向同一個 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

知道為什麼這些會返回不同的類型嗎?

這種行為在最近的更新中有所改變。請參閱修復:當您使用 OLE DB 提供程序從 Oracle 連結的伺服器中選擇數據時,NUMBER 類型的值被截斷

應用此修復程序後,具有未知精度/小數位數的 NUMBER 值將被視為具有 OLE DB 提供程序的雙精度值。如果精度很重要並且值的範圍不夠大,您可以啟用新的跟踪標誌 7314,它將開始將這些值視為數字 (38, 10)。

但是,我有點驚訝您得到的是 afloat而不是double`numeric`因為這似乎與文章有些矛盾,所以我不確定它是否能解釋您的確切情況。

引用自:https://dba.stackexchange.com/questions/177936