web-dev-qa-db-ja.com

SQL Server OPENQUERYからOracleがSQL Server 2016から2008で異なる列タイプを返す理由

同じマシン上に2つのSQL Serverインスタンスがあり、1つは2008と1つです。両方のインスタンスが同じOracle 12 Serverへのリンクサーバー接続を持っています。

次のクエリを実行すると、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');

VarcharType

enter image description here

両方のインスタンスが同じ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

これらが異なるタイプを返す理由は何ですか?

3
Gavin

この動作は最近の更新で変更されました。 FIX:NUMBER型の値は、OLE DB provider を使用してOracleにリンクされたサーバーからデータを選択すると切り捨てられる

この修正を適用すると、精度/スケールが不明なNUMBER値は、OLE DBプロバイダーで二重値として扱われます。精度が重要であり、値の範囲が十分に大きくない場合は、このような値を数値(38、10)として扱い始める新しいトレースフラグ7314を有効にします。

ただし、float\doubleではなくnumericを取得していることには少し驚いています。これは、記事と多少矛盾するようで、説明がわからないのです。あなたの正確な状況。