选择3个表和2个服务器的查询

时间:2011-05-17 15:11:27

标签: sql sql-server tsql sql-server-2008

我正在尝试创建一个存储过程,从2个不同服务器上的3个表中检索数据。这是我的select语句。

SELECT InvoiceLine.BranchNo, InvoiceLine.Type_IN_CR, InvoiceLine.Docket,InvoiceLine.ProductCode, 
   InvoiceLine.Inv_Price * (select OuterUnits From server.PopTables.dbo.Products Inner Join InvoiceLine ON server.PopTables.dbo.Products.ProductCode = InvoiceLine.ProductCode Where server.PopTables.dbo.Products.ProductCode = InvoiceLine.ProductCode) AS PricePT,
    InvoiceLine.Inv_Quantity * (select OuterUnits From server.PopTables.dbo.Products Inner Join InvoiceLine ON server.PopTables.dbo.Products.ProductCode = InvoiceLine.ProductCode Where server.PopTables.dbo.Products.ProductCode = InvoiceLine.ProductCode) AS QunatityPT,
    InvoiceLine.Inv_Total, InvoiceHeader.InvoiceDate

它将错误返回4次以下。

  

Msg 4104,Level 16,State 1,Procedure IMFertiliserRebates,Line 7   无法绑定多部分标识符“PROGRAMS.PopTables.dbo.Products.ProductCode”。

我正在尝试根据产品代码将一个表中的两列乘以另一台服务器上另一个表中的列。

我很失落!

任何帮助将不胜感激

感谢。

3 个答案:

答案 0 :(得分:3)

您需要在链接表上使用表别名

e.g。

SELECT invoiceline.branchno, 
       invoiceline.type_in_cr, 
       invoiceline.docket, 
       invoiceline.productcode, 
       invoiceline.inv_price * (SELECT outerunits 
                                FROM   serverb.table3.dbo.products p 
                                       INNER JOIN invoiceline 
                                         ON p.productcode = 
                                            invoiceline.productcode 
                                WHERE  p.productcode = invoiceline.productcode) 
       AS 
       pricept, 
       invoiceline.inv_quantity * (SELECT outerunits 
                                   FROM   serverb.table3.dbo.productsinner ps 
                                          INNER JOIN invoiceline 
                                            ON ps.productcode = 
                                               invoiceline.productcode 
                                   WHERE  p.productcode = 
                                          invoiceline.productcode) AS 
       qunatitypt, 
       invoiceline.inv_total, 
       invoiceheader.invoicedate 

因为你原来的SQL有点大,所以我做的更改

没有别名

  • ON server.PopTables.dbo.Products.ProductCode = invoiceline.productcode
  • WHERE server.PopTables.dbo.Products.ProductCode...
  • ON serverb.table3.dbo.productsinner = invoiceline.productcode
  • WHERE serverb.table3.dbo.productsinner.productcode = invoiceline.productcode

使用别名

  • ON p.ProductCode = invoiceline.productcode
  • WHERE p.ProductCode...
  • ON serverb.table3.dbo.productsinner = invoiceline.productcode
  • WHERE serverb.table3.dbo.productsinner.productcode = invoiceline.productcode

答案 1 :(得分:3)

您似乎正在使用链接服务器。正如其他人所指出的那样,使用链接服务器中的表或视图的别名,否则您将获得“多部分标识符无法绑定”错误。

这是4部分命名约定限制。例如server.PopTables.dbo.Products.ProductCode有五个部分,将给出错误。但是,SELECT products.ProductCode FROM server.PopTables.dbo.Products AS产品可以正常工作。

请记住,如果链接服务器是实例,请确保将名称括起来。例如[SERVERNAME \ INSTANCENAME]。第一次发生这对我来说真的很麻烦。

答案 2 :(得分:1)

我想让一个sp从链接服务器返回你需要的数据:

select OuterUnits From ServerB.Table3.dbo.Products 
       where ServerB.Table3.dbo.Products.ProductCode = @ProductCode

并直接从您的联接中的sp使用该结果,或将结果存储在serverA上的某个位置并在您的联接中使用它。我不会再查询链接表了。