在链接服务器上运行OPENQUERY并使用本地表中的数据时出现问题

时间:2019-11-14 17:02:21

标签: sql sql-server oracle

我们有一个名为SQL_LOCAL的SQL Server,一个链接的Oracle服务器是OLINK。

我在SQL_LOCAL中有一个表,其中包含3列。

|  C_ID  |  CON_NUM  |  CUS_NUM  |

我需要使用CUS_NUM从链接服务器OLINK中获取数据。

通常人们会做这样的事情:

SELECT ST.C_ID
      ,ST.CON_NUM
      ,OT.CUS_NBR
      ,OT.A_ID
      ,OT.L_NBR
FROM SQL_LOCAL.TABLE_NAME ST
JOIN OLINK.TABLE_NAME AS OT
    ON ST.CUS_NBR = OT.CUS_NBR

但是由于Oracle和SQL Server之间出现一些奇怪的数据类型问题,我得到了此错误:

  

链接服务器“ OLINK”的OLE DB提供程序“ OraOLEDB.Oracle”   列的元数据不一致。列“ V_IND”   对象“ DATABASE_NAME”(“ TABLE_NAME””)的值(编译时顺序4)为   报告在编译时其值为“ DBCOLUMNFLAGS_ISFIXEDLENGTH”为16   并且在运行时为0。

当前,解决该问题的方法是使用OPENQUERY发出查询,如果我们仅在链接服务器上使用数据,此方法就可以正常工作。但是,现在我需要对来自OLINK链接服务器上的数据使用来自SQL_LOCAL服务器的表。

我无法从本地表传递给OPENQUERY,所以我当前的工作方法将持续很长时间。 这是我当前的工作查询:

SELECT ST.BCA_ID
    ,ST.CONTRACT_NBR
    ,OT.C_NBR
    ,OT.A_ID
    ,OT.LOOKUP_NBR
FROM OPENQUERY(CRS,
    'SELECT
         C_NBR
        ,A_ID
        ,LOOKUP_NBR
    FROM OLINK.TABLE_NAME') AS OT
JOIN SQL_LOCAL.TABLE_NAME ST
ON OT.C_NBR = OT.C_NBR

如您所见,这不是很有效,因为它包含对OPENQUERY的全表扫描,但是我确实得到了预期的结果。但是,这对于我们的项目来说还不够好。这将占用更多的线轴空间。

除了在这里使用OPENQUERY外,我别无选择,也没有其他选择来针对SQL_LOCAL服务器启动连接。这2件事我无法更改,因此任何不涉及这2项要求的想法都对我不起作用。

有什么想法吗?

0 个答案:

没有答案