2013-10-07 231 views
5

SQLサーバーにOracleデータベースをヒットさせるためのリンクサーバー設定があります。私はドット表記法を使用してOracleテーブルに結合するSQL Serverのクエリを持っています。 Oracleから「No Data Found」エラーが表示されます。 Oracle側では、(ビューではなく)表にぶつかり、ストアド・プロシージャは関係しません。OracleサーバーにリンクされたSQLサーバーは、データが存在するときにデータを戻しません。

最初に、データがない場合は、ゼロの行を取得するだけでエラーは発生しません。
第2に、この場合は実際にデータがあるはずです。
第3に、PL/SQLコードでORA-01403エラーが発生しただけです。決してSQLではありません。

これは、完全なエラーメッセージです:
OLE DBプロバイダリンクサーバー "OM_ORACLE" の "OraOLEDB.Oracle" 返されたメッセージ "ORA-01403:データが見つかりません"。
メッセージレベル7,166、レベル16、状態2、 リンクサーバー "OM_ORACLE"のOLE DBプロバイダ "OraOLEDB.Oracle"から行のデータを取得できません。

ここにいくつかの詳細がありますが、私のテーブルとデータがないので、何も意味しないでしょう。私は、「データが見つかりません」というエラーが表示されますなぜ

select * 
    from eopf.Batch b join eopf.BatchFile bf 
       on b.BatchID = bf.BatchID 
      left outer join [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] du 
       on bf.ReferenceID = du.documentUploadID; 




は、私が理解することはできません。
これが問題とクエリです。以下のクエリは同じOracleテーブルを使用し、データは返されませんが、エラーは発生しません - 返される行はありません。

select * from [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] where documentUploadID = -1 



データを返します以下のクエリ。 SQL Serverテーブルの1つを結合から削除しました。しかし、バッチ・テーブルを削除しても、batchFileから返される行は変更されません(どちらの場合も271行 - batchFileのすべての行にバッチ・エントリがあります)。それでも同じbatchFile行を同じOracle行に結合する必要があります。

select * 
from eopf.BatchFile bf 
    left outer join [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] du 
     on bf.ReferenceID = du.documentUploadID; 



そして、このクエリ5行を返します。元のクエリと同じでなければなりません。 (私はbatchとbatchFileテーブルからデータが必要なので、これを使うことはできません)。

 select * 
    from [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] du 
    where du.documentUploadId 
    in 
    (
    select bf.ReferenceID 
    from eopf.Batch b join eopf.BatchFile bf 
       on b.BatchID = bf.BatchID); 

誰でもこのエラーが発生しましたか?

答えて

1

私は同じ問題があります。 Solution1:Oracleデータベースのデータを一時表にロードし、その代わりにその一時表に結合します。ここはa linkです。

投稿者a linkこの問題は、左の結合を使用することで確認できます。 私は自分の問題をチェックし、問題を解決するクエリを変更しました。

0

私の場合、私はリンクテーブルから作られた複雑なビューと、リンクテーブルとローカルテーブルに基づく3つのビューを持っていました。私はInner Joinsを使っていましたが、この問題が顕在化しました。左右の外部結合への結合を変更することにより、問題が解決されました。

0

私は同じ問題を持って、「=」演算子 代わり

select * from [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] where documentUploadID < 0 

を使用してみてくださいを避けることによって、それを解決しました。この問題を回避するために

おかげ

0

もう一つの方法は、Table Valued FunctionにOracleデータを引き戻すことです。これにより、SQL Serverが出て、Oracleからすべてのデータが取得され、結果のテーブル変数にスローされます。すべての目的と目的のために、クエリで結果のテーブル値関数を使用すると、Oracleデータは現在SQL Serverに対して「ローカル」になります。

私は元の問題は、SQL ServerがリモートOracleクエリの結果をインラインで含む複合クエリの実行を最適化しようとしていることだと思います。テーブル呼び出し関数を使用してOracle呼び出しをラップすると、SQL Serverは、リモートクエリ実行の結果ではなく、関数から返された結果のテーブル変数に対して複合クエリを最適化します。あなたはそれとして表値関数を使用することができます

CREATE function [dbo].[documents]() 
returns @results TABLE (

    DOCUMENT_ID INT NOT NULL, 
    TITLE VARCHAR(6) NOT NULL, 
    LEGALNAME VARCHAR(50) NOT NULL, 
    AUTHOR_ID INT NOT NULL, 
    DOCUMENT_TYPE VARCHAR(1) NOT NULL, 
    LAST_UPDATE DATETIME 
) AS 

BEGIN 
INSERT INTO @results 
SELECT  CAST(DOCUMENT_ID AS INT) AS DOCUMENT_ID, TITLE, LEGALNAME, CAST(AUTHOR_ID AS INT) AS AUTHOR_ID, DOCUMENT_TYPE, LAST_UPDATE 
FROM   OPENQUERY(ORACLE_SERVER, 
         'select DOCUMENT_ID, TITLE, LEGALNAME, AUTHOR_ID, DOCUMENT_TYPE, FUNDTYPE, LAST_UPDATE 
         from documents') 

return 
END 

それはあなたのSQLクエリ内のテーブルだった:

SELECT * FROM DOCUMENTS()

1

今日、私は内部結合と同じ問題を経験しました。 codechurnによって提案されたTable Valued Functionを作成するか、またはuser1935511によって提案されたTemporary Tableを使用するか、またはcymorgによって提案されたJoin Typesを変更することは、私にとってはオプションではありません。

私はを使用して、問合せオプティマイザを正しい方向に駆動しました。問題はネスト化されたループから遠ざかっているように見えます。私のためにハッシュメルターリモコンジョイントヒント。

REMOTEは、内部結合操作でのみ使用できるため、オプションではありません。したがって、次のようなものを使用するとうまくいくはずです。

select * 
from eopf.Batch b 
join eopf.BatchFile bf 
    on b.BatchID = bf.BatchID 
left outer merge join [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] du 
    on bf.ReferenceID = du.documentUploadID; 
関連する問題