我正在尝试创建一个存储过程,从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”。
我正在尝试根据产品代码将一个表中的两列乘以另一台服务器上另一个表中的列。
我很失落!
任何帮助将不胜感激
感谢。
答案 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上的某个位置并在您的联接中使用它。我不会再查询链接表了。