【问题标题】:Querying an Oracle database from SQL Server从 SQL Server 查询 Oracle 数据库
【发布时间】:2016-09-22 19:27:49
【问题描述】:

我有一个 Oracle 11g XE 数据库,我想将它转移到 SQL Server Express 2005 中。

起初我以为我只是在 Oracle 中将表生成为 SQL,操作数据格式,然后在 SQL Server 中运行查询。这适用于小表,但我有几个表有几十万行,有些表有数百万行,所以这个解决方案不起作用。

然后我创建了一个包含以下内容的 TNS 文件:

OracleTnsName = 
(
  DESCRIPTION=
  (
    ADDRESS = (PROTOCOL=TCP)(HOST=localhost)(PORT=1521)
  )
  (
    CONNECT_DATA = (SERVICE_NAME=XE)
  )
)

我按照我在其他地方找到的有关如何生成 ODBC 连接的说明进行操作,并且“测试连接”成功。

然后我运行这些命令在 MS SQL 中创建链接服务器:

EXEC sp_addlinkedserver 
     @server            = 'OracleLinkServer'
    ,@srvproduct        = 'OracleTnsName'
    ,@provider          = 'MSDASQL'
    ,@datasrc           = 'OracleTnsName'

EXEC sp_addlinkedsrvlogin 
     @rmtsrvname        = 'OracleLinkServer'
    ,@useself           = 'False'
    ,@locallogin        = NULL
    ,@rmtuser           = 'user'
    ,@rmtpassword       = 'password'

现在我正在尝试使用 openquery 从 SQL Server 查询 Oracle 数据库中的表:

select * from openquery(OracleLinkServer, 'select * from oracleTable')

但是得到一个错误:

消息 7399,第 16 层,状态 1,第 1 行
OLE DB 提供程序“MSDASQL”用于 链接服务器“OracleLinkServer”报告错误。提供者做了 不提供有关错误的任何信息。
消息 7303,第 16 级,状态 1,第 1 行
无法初始化 OLE DB 提供程序的数据源对象 链接服务器“OracleLinkServer”的“MSDASQL”。

当我检查链接服务器的属性,然后单击“确定”时,我收到此错误:

标题:Microsoft SQL Server Management Studio Express

“链接服务器已更新,但连接测试失败。您要编辑链接服务器属性吗?”


附加信息:

执行 Transact-SQL 语句或批处理时发生异常。 (Microsoft.SqlServer.Express.ConnectionInfo)


链接服务器“OracleLinkServer”的 OLE DB 提供程序“MSDASQL”报告错误。提供商没有提供有关该错误的任何信息。 无法为链接服务器“OracleLinkServer”初始化 OLE DB 提供程序“MSDASQL”的数据源对象。 (Microsoft SQL Server,错误:7399)

如需帮助,请点击:http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=09.00.5000&EvtSrc=MSSQLServer&EvtID=7399&LinkId=20476


按钮:

&是

&否

请帮忙!

谢谢

【问题讨论】:

  • 欢迎使用 StackOverflow:如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行并单击“代码示例”按钮 ({ } ) 在编辑器工具栏上很好地格式化和语法突出显示它!
  • 驱动和 SQL Server 的位数是多少?如果您只安装了一个 32 位驱动程序并且您正在运行一个 64 位 SQL Server,那就可以解释它了。
  • 您确认您在 SQL Server 上安装了 Oracle 客户端和 TNS 文件?然后,您需要使用TNSPINGSQLPLUS 等Oracle 工具测试Oracle 客户端。然后,您需要确认位数匹配。我建议不要将 Oracle 数据导出为平面文件,而是将其复制并以这种方式导入,因为 Oracle 驱动程序可能非常不友好
  • 如果您只选择一个列而不是*,会发生什么? (最好是像整数这样简单的东西)或者用WHERE 子句挑选一个特定的行?有时,列中的错误数据会导致链接服务器代码阻塞——我特别看到了超出 SQL Server 有效日期范围的 Oracle 日期。

标签: sql-server oracle oledb openquery tnsnames


【解决方案1】:

如果您已成功添加链接服务器,则不再需要OPENQUERY。您可以将链接服务器名称作为限定名称的第一部分,如下所示:

SELECT * FROM OracleLinkServer.database.schema.table

不确定您需要哪些部分,但点是关键。先试试这个:

SELECT * FROM OracleLinkServer...oracleTable

【讨论】:

  • 谢谢。我试过这种格式,但同样的错误信息。
  • 也可以试试这个:[OracleLinkServer]...[schema].[table]
【解决方案2】:
select * 
from [server]..[xxx].[yyyyy] 

它对我有用。

【讨论】:

    【解决方案3】:

    改变

    ,@provider = 'MSDASQL'
    

    ,@provider = 'MSDAORA'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多