Sql server IBM i(AS400)到SQL Server表联接语法

Sql server IBM i(AS400)到SQL Server表联接语法,sql-server,join,ibm-midrange,Sql Server,Join,Ibm Midrange,我使用Excel连接通过SQL Server连接从DB2 for IBM I(AS400)查询客户合同,并尝试加入SQL Server表以确定合同到期日期和销售团队责任 AS400查询运行,但在加入SQL Server表ACCOUNT.dbo.CUSTOMER时,我仍然收到一个错误,但在加入时找不到替代语法的引用 [select * from openquery( bpcsrpt_new,' select s.SCID, s.SVER, s.CONTEXP, a.ACCTNAME, a.SAL

我使用Excel连接通过SQL Server连接从DB2 for IBM I(AS400)查询客户合同,并尝试加入SQL Server表以确定合同到期日期和销售团队责任

AS400查询运行,但在加入SQL Server表
ACCOUNT.dbo.CUSTOMER
时,我仍然收到一个错误,但在加入时找不到替代语法的引用

[select  *
from openquery(
bpcsrpt_new,'
select s.SCID, s.SVER, s.CONTEXP, a.ACCTNAME, a.SALESTEAM

from AS400table1.contract c, AS400table1.subcontract s, ACCOUNT.dbo.CUSTOMER a

where c.cid=''Active''
and c.cid=s.scid
and c.cver=s.sver
and c.cid=a.acid')]

那是行不通的。使用openquery时,语句将被发送到远程计算机。显然,ACCOUNT.dbo.CUSTOMER不在远程IBMi(又名AS400)机器上

您可以在查询中直接使用4部分命名

select s.SCID, s.SVER, s.CONTEXP, a.ACCTNAME, a.SALESTEAM
from IBMILNKNAM.IBMIDBNAM.IBMILIBNAM.contract c
     , IBMILNKNAM.IBMIDBNAM.IBMILIBNAM.subcontract s
     , ACCOUNT.dbo.CUSTOMER a
where c.cid='Active'
and c.cid=s.scid
and c.cver=s.sver
and c.cid=a.acid
但是请注意,SQL Server将收回完整的合同和分包合同表,以便在本地进行连接

如果您只对IBMi上大表的几行感兴趣,那么Openquery是一个更好的选择。如果我没记错的话,大概是这样的:(未测试)


谢谢你,查尔斯。你的第二个选择非常有效。很高兴听到……意味着我的记忆还没有完全消失!还有一件事要补充…注意,在第二个示例中,我使用的是显式连接,而不是示例中的隐式连接。最佳做法是在
FROM
中使用带有连接条件的显式连接,而不是在
中使用带有连接条件的隐式连接,其中
select  * 
from (select * from Openquery(IBMIKNKNAM, 'select s.SCID, s.SVER, s.CONTEXP 
                            from contract c
                                 join subcontract s 
                                       on c.cid=s.scid
                                       and c.cver=s.sver
                           where c.cid=''Active'')) as rmt
      join ACCOUNT.dbo.CUSTOMER a on a.acid = rmt.cid