为什么我不能通过 SQL-SERVER 2008 链接服务器读取 Oracles CLOB 列?

ber*_*d_k 10 sql-server-2008 oracle oracle-11g

我想从 SQL-Server 2008 访问 Oracle 11g 数据库中的数据

我设置了一个链接服务器,当我执行

select * from [Link_server_name]..Oracle_schema.Oracle_table
Run Code Online (Sandbox Code Playgroud)

和 Oracle_table 包含 Number 和 varchar2 列,所有工作都作为例外。

但是当 Oracle_table 包含一个 CLOB 列时,我收到以下错误:

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Unspecified error' zurückgeben。

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung '发生 Oracle 错误,但无法从 Oracle 检索错误消息。祖鲁克本。

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung '不支持数据类型。' 祖鲁克本。

消息 7306,级别 16,状态 2,第 1 行

Die '"MCCAPP"."DOGGRUPPEN"'-Tabelle vom OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' kann nicht geöffnet werden。

使用 OPENQUERY

SELECT * FROM OPENQUERY([L_V407SR8T], 'Select CLOB_COLUMN from Oracle_table'  )
Run Code Online (Sandbox Code Playgroud)

我得到

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung '发生 Oracle 错误,但无法从 Oracle 检索错误消息。祖鲁克本。Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung '不支持数据类型。' 祖鲁克本。

请原谅德语错误消息。

我的问题:有没有办法通过链接服务器读取 CLOB 列?

编辑:

  • SQL Server 导入和导出向导似乎也依赖于 OLE DB 并且在相同的表上很糟糕
  • 我在问自己,问题是否取决于字符集的使用,但我无法更改它们
  • 作为实际工作,我使用了一些 PowerShell 脚本来获取数据,但是

ber*_*d_k 2

对答案 SO 问题的评论 如何使用 OleDb 读取 Oracle 中的 CLOB 列?

包含旧Microsoft 支持帖子的链接,其中包含以下声明

不支持 Oracle 8.x 特定的数据类型,例如 CLOB、BLOB、BFILE、NCHAR、NCLOB 和 NVARCHAR2。

如果能找到一些最新的参考文献那就太好了。

我做了一些谷歌研究,只找到了解决方法。我担心该数据类型仍然不受支持。

编辑 02/05/2011

我真的不明白为什么微软无法解决这个问题。以下PowerShell脚本使用OLE-DB从Oracle数据库中读取包含CLOB列的表,并使用bulkCopy将数据插入到Sql-Server上现有的类似表中,这是一种非常有效的方法。

根据您的安装调整以下连接字符串、查询和表名称:

# 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"
Run Code Online (Sandbox Code Playgroud)

以下代码将 oracle 表复制到 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
    }
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句:该代码基于 Chad Millers Very Simple Data Dictionary codeplex 项目

目前,我知道使用 PowerShell 是将带有 CLOB 的数据从 Oracle 复制到 Sql-Server 的唯一方法,而不是使用 C# 或任何第三方工具。

我既没有使用导入/导出向导,也没有使用链接服务器。