【问题标题】:Cannot get the data of the row from the OLE DB provider 'ProviderName' for linked server 'LinkedServerName'无法从链接服务器“LinkedServerName”的 OLE DB 提供程序“ProviderName”获取行的数据
【发布时间】:2011-01-24 17:21:59
【问题描述】:

当我尝试执行这个涉及 Linked Server to Oracle 的查询时,我遇到了这个问题。在下面找到查询,

SELECT DISTINCT Convert(nvarchar(100),A.ZIP_CD)
               ,Convert(nvarchar(100),A.CITY)
               ,Convert(nvarchar(100),A.ST_CD)
               ,Convert(nvarchar(100),E.PCT)
               ,Convert(nvarchar(100),B.DEFAULT_DEL_CHG)
               ,Convert(nvarchar(100),E.DEL_TAX)

FROM [LIVE]..[CUSTOM].MASTER_ZIP A,
     [LIVE]..[MISC].ZONE B,
     [LIVE]..[MISC].ZIP2ZONE C,
     [LIVE]..[MISC].ZIP2TAX D,
     [LIVE]..[SALES].TAT E
WHERE A.ZIP_CD = C.ZIP_CD
AND ISNULL(B.DEFAULT_DEL_CHG,0) <> 0
AND A.USPS_PRIM = 'P'
AND C.ZONE_CD = B.ZONE_CD
AND A.ZIP_CD = D.ZIP_CD
--AND decode(D.TAX_CD,'999','99',d.tax_cd) = E.TAT_CD
AND (Case When D.TAX_CD = '999' Then '99' Else D.TAX_CD End) = E.TAT_CD

这是我得到的错误,

无法从链接服务器“LIVE”的 OLE DB 提供程序“OraOLEDB.Oracle”获取行的数据。

我在一个论坛上发现说要尝试转换为 nvarchar,因为 Oracle 在 sql server 中转换数字时出现问题,但我仍然遇到同样的错误。

关于如何解决此问题的任何想法?谢谢。

【问题讨论】:

    标签: oracle oledb linked-server


    【解决方案1】:

    到目前为止,我发现,有几件事可能会触发此错误。

    • 返回 100 个结果。有些人在添加“前 100 名”作为最大结果时,他们的查询会正常工作。
    • 有人声称您应该使用带有完全限定路径的 openquery() 到表(包括服务器)来对链接数据库执行查询。
    • 另一种说法是传递的日期格式不兼容。

    找出哪一个,我还没有找到解决方案,但也许这三个中的一个会帮助你。

    【讨论】:

    • 放弃 openquery() 支持 FQP 对我有用
    【解决方案2】:

    在包含 sqlserver 表和在 Oracle 上包含 openquery 的视图之间存在连接的视图。

    select * 
    FROM vwFMC01 
    WHERE LOCATIONNAME = '1001002' works ok, but
    
    select * 
    FROM vwFMC01 
    WHERE LOCATIONNAME = '1001003' fails!
    

    Join 在两个 varchar(255) 字段上。 解决了将连接字段转换为 char(50) 的问题:

    select E.EMPLOYEENUMBER, 
        E.INITIALS, 
        E.NAME1, 
        E.LOCATIONNAME,
        L.DESCRIPTION, 
    from biz_tblEmployee E
    inner join vwGerpLocation L 
        on convert(char(50), E.LOCATIONNAME) = convert(char(50), L.LOCATIONNAME)
    

    【讨论】:

    • 这个旧答案仍然适用。你真了不起!提前谢谢你,伙计。??
    【解决方案3】:

    一方面,您需要为这些列指定列别名。

    当您执行SELECT DISTINCT 'abc' ABC ... 时会发生什么?

    【讨论】:

      【解决方案4】:

      我们遇到了类似的错误。

      无法从 OLE DB 提供程序获取行的数据 链接服务器“LINKEDSERVER”的“OraOLEDB.Oracle”。 [SQL 状态 42000] (错误 7346)链接服务器的 OLE DB 提供程序“OraOLEDB.Oracle” “LINKEDSERVER”返回消息“ORA-01403:未找到数据”

      事实证明,SQL Server 数据库的可比性从 2008 年到 2014 年发生了变化。这最终破坏了一些索引。我们回滚了更改并重试了没有问题的查询。

      由于 2014 兼容模式对我们很重要,我们再次将其更改为 2014,重建索引,这似乎消除了问题。希望这可以帮助 w.w.w. 中的其他人。

      【讨论】:

        【解决方案5】:

        改变

        ... AND (Case When D.TAX_CD = '999' Then '99' Else D.TAX_CD End) = E.TAT_CD
        

        ... AND (Case When D.TAX_CD = '999' Then '99' Else D.TAX_CD End) Like E.TAT_CD
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-22
          • 1970-01-01
          • 1970-01-01
          • 2014-05-25
          • 1970-01-01
          • 1970-01-01
          • 2017-08-10
          • 1970-01-01
          相关资源
          最近更新 更多