IBM i (AS400) 到 SQL 服务器 table 连接语法

IBM i (AS400) to SQL Server table join syntax

我正在使用 Excel 连接通过 SQL 服务器连接从 DB2 for IBM i (AS400) 查询客户合同并尝试加入 SQL 服务器 table确定合同到期日期和销售团队责任。

A​​S400 查询运行,但我在加入 SQL 服务器 table 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 不在远程 IBM i(aka 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 服务器将撤回完整的合同并分包 table 以在本地进行连接。

如果您只对 IBM i 上大型 table 的几行感兴趣,Openquery 是更好的选择。如果我没记错的话,是这样的:(未测试)

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