Warum kann ich Oracles CLOB-Spalten nicht über den SQL-SERVER 2008-Verbindungsserver lesen?

10

Ich möchte von SQL-Server 2008 aus auf Daten in einer Oracle 11g-Datenbank zugreifen

Ich habe einen Verbindungsserver eingerichtet und bei der Ausführung

select * from [Link_server_name]..Oracle_schema.Oracle_table

und Oracle_table enthält die Spalten Number und varchar2, alle funktionieren wie ausgenommen.

Wenn die Oracle_table jedoch eine CLOB-Spalte enthält, wird der folgende Fehler angezeigt:

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Nicht spezifizierter Fehler' zurückgeben.

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Oracle-Fehler aufgetreten, aber Fehlermeldung konnte nicht von Oracle abgerufen werden.' zurückgeben.

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Datentyp wird nicht unterstützt.' zurückgeben.

Nachricht 7306, Ebene 16, Status 2, Zeile 1

Die "MCCAPP". "DOGGRUPPEN" - Tabelle vom OLE DB-Anbieter "MSDAORA" für den Verbindungsserver "L_V407SR8T" kann nicht gehört werden.

OPENQUERY verwenden

SELECT * FROM OPENQUERY([L_V407SR8T], 'Select CLOB_COLUMN from Oracle_table'  )

Ich bekomme

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Oracle-Fehler aufgetreten, aber Fehlermeldung konnte nicht von Oracle abgerufen werden.' zurückgeben. Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Datentyp wird nicht unterstützt.' zurückgeben.

Bitte entschuldigen Sie deutsche Fehlermeldungen.

Meine Frage: Gibt es eine Möglichkeit, CLOB-Spalten über verknüpfte Server zu lesen?

BEARBEITEN:

  • Der SQL Server-Import- und Export-Assistent scheint auch von OLE DB abhängig zu sein und saugt an denselben Tabellen
  • Ich frage mich, ob das Problem von den verwendeten Zeichensätzen abhängt, aber ich kann sie nicht ändern
  • Als praktische Lösung verwende ich einige PowerShell-Skripte, um an die Daten zu gelangen, aber
bernd_k
quelle
Sie sollten in der Lage sein, das CLOB zu lesen, wenn Sie es zumindest zuerst konvertieren können ... msdn.microsoft.com/en-us/library/ms378813.aspx
jcolebrand

Antworten:

3

Laden Sie einen Oracle 11-Datenbankclient herunter und installieren Sie ihn auf Ihrem SQL Server 2008-Computer.

Richten Sie einen Verbindungsserver mit einem Oracle OLE DB-Anbieter (OraOLEDB.Oracle) ein.

Stellen Sie sicher, dass "InProcess zulassen" in den Anbieteroptionen aktiviert ist.

Der Oracle 11 OLE DB-Client unterstützt CLOBs.

Serge A.
quelle
2

Ein Kommentar zu einer Antwort SO Frage Wie lese ich eine CLOB-Spalte in Oracle mit OleDb?

enthält einen Link zum alten Microsoft Support- Beitrag mit der folgenden Anweisung

Oracle 8.x-spezifische Datentypen wie CLOB, BLOB, BFILE, NCHAR, NCLOB und NVARCHAR2 werden nicht unterstützt.

Es wäre schön, weitere aktuelle Referenzen zu finden.

Ich habe einige Google-Recherchen durchgeführt und nur Problemumgehungen gefunden. Ich fürchte, der Datentyp wird immer noch nicht unterstützt.

Bearbeiten 02/05/2011

Ich verstehe wirklich nicht, warum Microsoft dieses Problem nicht beheben kann. Das folgende PowerShell-Skript verwendet OLE-DB, um eine Tabelle mit einer CLOB-Spalte aus einer Oracle-Datenbank zu lesen und die Daten mithilfe von BulkCopy in eine vorhandene ähnliche Tabelle auf SQL Server einzufügen. Dies ist eine sehr effiziente Methode.

Passen Sie die folgenden Verbindungszeichenfolgen, Abfragen und Tabellennamen an Ihre Installation an:

# Here I use OLE-DB to read the Oracle database
$ConnectionString ="Server=ignore;User Id=myUser;Password=myPassword;Data Source=myTns;Provider=OraOLEDB.Oracle;"

# Here I use .NET SqlClient
$SqlClientConnString = "Data Source=localhost;Initial Catalog=myDestinationDB;Integrated Security=True"

$sql = "select int_col, clob_col from TABLE_WITH_CLOB"
$tableName = "COPY_OF_CLOB_TABLE"

Der folgende Code kopiert die Oracle-Tabelle in eine SQL Server-Tabelle

$OLEDBConn = New-Object System.Data.OleDb.OleDbConnection($ConnectionString)
$OLEDBConn.open()
$readcmd = New-Object system.Data.OleDb.OleDbCommand($sql,$OLEDBConn)
$readcmd.CommandTimeout = '300'
$da = New-Object system.Data.OleDb.OleDbDataAdapter($readcmd)
$dt = New-Object system.Data.datatable
[void]$da.fill($dt)
$OLEDBConn.close()
#Write-Output $dt


if ($dt)
{
    try
    {
        $bulkCopy = new-object ("Data.SqlClient.SqlBulkCopy") $SqlClientConnString
        $bulkCopy.DestinationTableName = $tableName
        $bulkCopy.BatchSize = 50000
        $bulkCopy.BulkCopyTimeout = 0
        $bulkCopy.WriteToServer($dt)
    }
    catch
    {
        $ex = $_.Exception
        #Write-LogMessage -Source 'Write-DataTable' -Message "$($connectionName):$ex.Message"
        Write-Error "Write-DataTable$($connectionName):$ex.Message"
        continue
    }
}

Übrigens: Der Code basiert auf dem Codeplex-Projekt Really Mill Data Dictionary von Chad Millers

Derzeit ist die Verwendung von PowerShell die einzige Möglichkeit, Daten mit CLOBs von Oracle auf SQL Server zu kopieren, ohne C # oder Tools von Drittanbietern zu verwenden.

Ich konnte weder den Import / Export-Assistenten noch Verbindungsserver verwenden.

bernd_k
quelle
grrrr, das ist scheiße, wenn man bedenkt, dass es seitdem drei Punkte für ORA und mindestens einen Punkt für MS gibt ... AHANo new updates are planned for future releases of these components including their support against versions later than Oracle 8i.
jcolebrand
Ich verstehe wirklich nicht, warum Microsoft dieses Problem nicht beheben kann . Aus dem gleichen Grund hat Microsoft die Unterstützung der Oracle-Clientbibliothek mit Dotnet-Framework eingestellt - "andere Leute machen es besser", wenn ich ihre Antworten in der Vergangenheit rücksichtslos umschreibe. Keine Liebe zwischen diesen beiden verloren, sage ich dir.
ScottCher