我们有一个名为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项要求的想法都对我不起作用。
有什么想法吗?