trapemiyaの日記

hatenablogが新しくなったんで新規一転また2019年1月からちょこちょこ書いてます。C#中心のプログラミングに関するお話です。

【SQL ServerからOracleへのリンクサーバー】列’xxx’に必要なデータ長に一致しないデータが返されました。必要な (最大) データ長は xxですが、返されたデータ長は xx です。

SQL ServerからOracleへのリンクサーバーを設定している状態で、例えば以下のSQLを実行すると次のエラーが出る。

select * from openquery(edpstv, 'select '''' as 有無 from BSS.契約 ')

リンク サーバー 'edpstv' の OLE DB プロバイダー 'OraOLEDB.Oracle' から、列 '[OraOLEDB.Oracle].有無' に必要なデータ長に一致しないデータが返されました。必要な (最大) データ長は 4 ですが、返されたデータ長は 2 です。

はっ? 何のこと・・・

ネットを漁ると、「Microsoft OLE DB Provider for ORACLE」に変更したらうまく行ったという記述があったが、これは廃止になるものなので基本的には使用してはいけない。

Microsoft OLE DB Provider for Oracle の概要
https://docs.microsoft.com/ja-jp/sql/ado/guide/appendixes/microsoft-ole-db-provider-for-oracle?view=sql-server-ver15

型を指定していないのがいけないのかと思い、次のように型を指定してあげたらうまく行った。

select * from openquery(edpstv, 'select cast('''' as varchar(2)) from BSS.契約 ')

でもやっぱり謎だなぁ・・・