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 列?
编辑:
对答案 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# 或任何第三方工具。
我既没有使用导入/导出向导,也没有使用链接服务器。
归档时间: |
|
查看次数: |
5446 次 |
最近记录: |