web-dev-qa-db-fra.com

Pourquoi ne puis-je pas lire des colonnes d'oracles via SQL-Server 2008 Linked Server?

Je souhaite accéder aux données dans une base de données Oracle 11G à partir de SQL-Server 2008

J'ai configuré un serveur lié et quand j'exécute

select * from [Link_server_name]..Oracle_schema.Oracle_table

et Oracle_Table contient des colonnes NUMÉRO ET VARCHAR2, toutes fonctionne comme exceptionnellement.

Mais lorsque la carte Oracle_Table contient une colonne de clob, j'obtiens l'erreur suivante:

DER OLE DB-ANBIETER 'MSDAORA' FÜR DEN VERBINGUNGSSERVER 'L_V407SR8T' HAT DIE MELDUNG 'erreur non spécifiée' Zurückgeben.

DER OLE DB-ANBIETER 'MSDAORA' FÜR DEN VERBINGUNGSSERVER 'L_V407SR8T' HAT DIE MELDUNG 'Oracle Erreur est survenu, mais un message d'erreur n'a pas pu être récupéré de Oracle.' Zurückgeben.

DER OLE DB-ANBIETER 'MSDAORA' FÜR DEN VERBINDUNGSSERVER 'L_V407SR8T' HAT DIE MELDUNG 'Type de données n'est pas pris en charge.' Zurückgeben.

MSG 7306, niveau 16, État 2, ligne 1

Die '"McCapp". "DogGruppen"' - Tabelle Vom OLE DB-ANBIETER 'MSDAORA' FÜR DEN VERBINGUNGSSERVER 'L_V407SR8T' Kann Nicht Geöffnet Werden.

Utiliser OpenQuery

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

Je reçois

DER OLE DB-ANBIETER 'MSDAORA' FÜR DEN VERBINGUNGSSERVER 'L_V407SR8T' HAT DIR DIE Erreur Oracle a eu lieu, mais le message d'erreur n'a pas pu être récupéré de Oracle. 'Zurückgeben. Der OLE DB-ANBIETER 'MSDAORA' FÜR DEN VERBINDUNGSSERVER 'L_V407SR8T' Type de données Die MelDung 'Type de Die MelDung n'est pas pris en charge.' Zurückgeben.

Veuillez excuser les messages d'erreur allemand.

Ma question: Y a-t-il un moyen de lire les colonnes de clob via des serveurs liés?

ÉDITER:

  • SQL Server Import et Export Wizard semble dépendre de OLE DB aussi et craint sur les mêmes tables
  • Je me demande si le problème dépend des utilisations des ensembles de caractères, mais je ne peux pas les changer
  • Comme un travail pratique autour, j'utilise des scripts PowerShell pour obtenir les données, mais
10
bernd_k

Téléchargez et installez un client de base de données Oracle 11 sur votre machine SQL Server 2008.

Configurez un serveur lié à l'aide d'un fichier Oracle OLE DB (Oraoledb.oracle).

Assurez-vous que "Autoriser Inprocess" est activé dans les options du fournisseur.

L'Oracle 11 OLE DB Client prend en charge les clobs.

3
Serge A.

Un commentaire à une réponse SO Question Comment lire une colonne de CLOB dans Oracle en utilisant OLEDB?

contient un lien vers l'ancien support Microsoft Publier avec la déclaration suivante

Les types de données spécifiques à Oracle 8.x, tels que Clob, Blob, BFILE, NCHAR, NCLOB et NVARCHAR2, ne sont pas pris en charge.

Ce serait bien de trouver des références plus actuelles.

J'ai fait des recherches sur Google et n'a trouvé que la solution de contournement. Je crains que le type de données ne soit toujours pas pris en charge.

Modifier le 02/05/2011

Je ne comprends vraiment pas pourquoi Microsoft ne peut pas résoudre ce problème. Le script de PowerShell suivant utilise OLE-DB pour lire une table contenant une colonne de CLOB dans une base de données Oracle et insérez les données dans une table similaire existante sur SQL-Server à l'aide de BulkCopy, ce qui est un moyen très efficace.

Ajustez les chaînes de connexion suivantes, la requête et le nom de la table à votre installation:

# 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"

Le code suivant copie la table Oracle dans une table SQL-Server

$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
    }
}

BTW: Le code est basé sur Tchad Millers Projet de dictionnaire de données vraiment simple

En utilisant actuellement PowerShell, c'est le seul moyen de copier des données avec des clobs de Oracle sur SQL-Server sans utiliser C # ou des outils tiers.

Je n'ai pas réussi à utiliser ni importer/export Wizard ni serveurs liés.

2
bernd_k