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


10

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

我设置了链接服务器,执行时

select * from [Link_server_name]..Oracle_schema.Oracle_table

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

但是,当Oracle_table包含CLOB列时,出现以下错误:

OLE DB-Anbieter'MSDAORA'和Verbindungsserver'L_V407SR8T'的帽子被Meldung'Unspecified error'破坏了。

'OLE DB-Anbieter'MSDAORA'和Verbindungsserver'L_V407SR8T'已死于Meldung'发生Oracle错误,但无法从Oracle检索错误消息。祖鲁格本。

'从OLE DB-Anbieter'MSDAORA'中删除文件'L_V407SR8T',在Meldung中'不支持数据类型。祖鲁格本。

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

死于“ MCCAPP”。

使用OPENQUERY

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

我懂了

'OLE DB-Anbieter'MSDAORA'和Verbindungsserver'L_V407SR8T'已死于Meldung'发生Oracle错误,但无法从Oracle检索错误消息。祖鲁格本。'从OLE DB-Anbieter'MSDAORA'中删除文件'L_V407SR8T',在Meldung中'不支持数据类型。祖鲁格本。

请原谅德语错误消息。

我的问题:是否可以通过链接的服务器读取CLOB列?

编辑:

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

你应该能够读取CLOB,如果你至少可以在第一...转换msdn.microsoft.com/en-us/library/ms378813.aspx
jcolebrand

Answers:


3

在SQL Server 2008计算机上下载并安装Oracle 11数据库客户端。

使用Oracle OLE DB提供程序(OraOLEDB.Oracle)设置链接服务器。

确保在提供程序选项中启用了“允许正在进行的处理”。

Oracle 11 OLE DB客户端支持CLOB。


2

解答SO问题的注释 如何使用OleDb在Oracle中读取CLOB列?

包含带有以下语句的旧Microsoft支持文章的链接

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

很高兴找到更多当前的参考文献。

我做了一些Google研究,发现只有解决方法。我担心仍然不支持该数据类型。

编辑02/05/2011

我真的不明白为什么Microsoft无法解决此问题。以下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"

以下代码将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
    }
}

顺便说一句:该代码基于Chad Millers的Really Simple Data Dictionary Codeplex项目

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

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


从那以后,grrrr很糟糕,因为从那时起ORA已经发布了3分,MS至少发布了1分... AHANo new updates are planned for future releases of these components including their support against versions later than Oracle 8i.
jcolebrand

我真的不明白为什么Microsoft无法解决此问题?出于同样的原因,如果我过去无情地解释他们的回答,Microsoft便不再支持dotnet框架Oracle客户端库-“其他人做得更好”。我告诉你,这两者之间没有失去的爱。
ScottCher 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.