2013-10-07 10 views
5

Ich habe einen Verbindungsserver Setup in SQL Server, um eine Oracle-Datenbank zu treffen. Ich habe eine Abfrage in SQL Server, die in der Oracle-Tabelle mithilfe der Punktnotation verknüpft. Ich erhalte den Fehler "Keine Daten gefunden" von Oracle. Auf der Oracle-Seite treffe ich eine Tabelle (keine Ansicht) und keine gespeicherte Prozedur.SQL Server verknüpfter Server zu Oracle gibt keine Daten gefunden, wenn Daten vorhanden sind

Erstens, wenn es keine Daten gibt, sollte ich nur Null Zeilen und keinen Fehler erhalten.
Zweitens sollte es in diesem Fall tatsächlich Daten geben.
Drittens habe ich nur den ORA-01403-Fehler im PL/SQL-Code gesehen; niemals in SQL.

Dies ist die vollständige Fehlermeldung:
OLE DB-Provider "OraOLEDB.Oracle" für den Verbindungsserver "OM_ORACLE" zurückgegeben Meldung "ORA-01403: keine Daten gefunden".
Msg 7346, Ebene 16, Status 2, Zeile 1 Die Daten der Zeile können nicht vom OLE DB-Provider "OraOLEDB.Oracle" für den Verbindungsserver "OM_ORACLE" abgerufen werden.

Hier sind einige weitere Details, aber es bedeutet wahrscheinlich nichts, da Sie meine Tabellen und Daten nicht haben.
Dies ist die Abfrage mit dem Problem:

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; 




Ich kann nicht verstehen, warum ich ein „keine Daten gefunden“ Fehler. Die folgende Abfrage verwendet dieselbe Oracle-Tabelle und gibt keine Daten zurück, aber ich erhalte keinen Fehler - ich bekomme nur keine Zeilen zurück.

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



Die Abfrage unter Daten zurückgibt. Ich habe gerade eine der SQL Server-Tabellen aus dem Join entfernt. Das Entfernen der Stapeltabelle ändert jedoch nicht die Zeilen, die von BatchFile zurückgegeben werden (271 Zeilen in beiden Fällen - alle Zeilen in BatchFile haben einen Stapeleintrag). Es sollte immer noch dieselben BatchFile-Zeilen denselben Oracle-Zeilen beitreten.

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



Und diese Abfrage gibt 5 Zeilen. Es sollte die gleiche 5 von der ursprünglichen Abfrage sein. (Ich kann das nicht verwenden, da ich Daten aus der Batch- und BatchFile-Tabelle benötige).

 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); 

Hat jemand diesen Fehler erlebt?

Antwort

1

Ich habe das gleiche Problem. Lösung1: Laden Sie die Daten aus der Oracle-Datenbank in eine temporäre Tabelle, und verbinden Sie sich stattdessen mit dieser temporären Tabelle - hier ist a link.

Von diesem Beitrag a link können Sie herausfinden, dass das Problem mit linker Verbindung sein kann. Ich habe mit meinem Problem überprüft und after ändern Abfrage löst es Problem.

0

In meinem Fall hatte ich eine komplexe Sicht aus einer verknüpften Tabelle, 3 Ansichten basierend auf der verknüpften Tabelle und einer lokalen Tabelle. Ich benutzte Inner Joins und dieses Problem manifestierte sich. Durch Ändern der Verknüpfungen zu den linken und rechten äußeren Verknüpfungen (falls zutreffend) wurde das Problem behoben.

0

habe ich das gleiche Problem und es gelöst, indem der '=' Operator try

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

Statt mit zu vermeiden.

Dank

0

Ein anderer Weg zur Arbeit, um das Problem der Oracle-Daten in ein Table Valued Function zurück zu ziehen ist. Dies führt dazu, dass SQL Server alle Daten von Oracle ausgibt und abruft und sie in eine resultierende Tabellenvariable wirft. Für alle Zwecke und Zwecke sind die Oracle-Daten jetzt "lokal" für SQL Server, wenn Sie die resultierende Tabellenwertfunktion in einer Abfrage verwenden.

Ich glaube, das ursprüngliche Problem ist, dass SQL Server versucht, die Ausführung Ihrer Compound-Abfrage zu optimieren, die die Remote-Oracle-Abfrageergebnisse in-line enthält. Mithilfe einer Tabellenwertfunktion zum Umbrechen des Oracle-Aufrufs optimiert SQL Server die zusammengesetzte Abfrage für die resultierende Tabellenvariable, die von der Funktion zurückgegeben wird, und nicht für die Ergebnisse der Ausführung der fernen Abfrage.

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 

können Sie dann die Tabellenwertfunktion, wie sie es verwenden, eine Tabelle in Ihrer SQL-Abfragen waren:

SELECT * FROM DOCUMENTS()

1

Heute erlebte ich das gleiche Problem mit einem inneren Join. Als Table Valued Function vorgeschlagen codechurn oder Temporary Table Vorschlag user1935511 oder die Änderung Join Types vorgeschlagen von cymorg sind keine Optionen für mich, ich mag meine Lösung zu teilen.

Ich habe Join Hints verwendet, um den Abfrageoptimierer in die richtige Richtung zu fahren, da das Problem von der Join-Strategie für verschachtelte Schleifen mit der entfernten Tabelle lokal aufzusteigen scheint. Für mich HASH, MERGE und REMOTE Join Hinweise arbeitete.

Für Sie REMOTE wird keine Option sein, da es nur für innere Join-Operationen verwendet werden kann. Also sollte etwas wie das Folgende funktionieren.

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; 
Verwandte Themen