2015-07-20 175 views
2

我正在使用Excel Connection通過SQL Server連接從DB2 for IBM i(AS400)查詢客戶合同,並試圖加入SQL Server表以確定合同到期日期和銷售團隊的責任。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')] 

回答

4

這不起作用。當您使用openquery時,語句會被髮送到遠程機器。顯然,ACCOUNT.dbo.CUSTOMER不在遠程IBM i(又名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將會重新拉開完整合同和轉包表做本地的加盟。

如果您只對IBM i上的大表的幾行感興趣,那麼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 
+0

謝謝Charles。你的第二個選項完美運作。 – SeaFarmer

+2

很高興聽到......意味着我的記憶並未完全被拍攝!還有一件事要補充......請注意,在第二個示例中,我使用顯式連接,而不是示例中的隱式連接。最佳做法是在'FROM'中使用顯式連接,而不是在'WHERE'中使用連接標準的隱式連接 – Charles