Выберите Запрос через 3 таблицы и 2 сервера - PullRequest
1 голос
/ 17 мая 2011

Я пытаюсь создать хранимую процедуру, которая извлекает данные из 3 таблиц на 2 разных серверах.Это оператор выбора, который у меня есть.

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 раз.

Сообщение 4104, уровень 16, состояние 1, процедура IMFertiliserRebates, строка 7Не удалось связать идентификатор из нескольких частей «PROGRAMS.PopTables.dbo.Products.ProductCode».

Я пытаюсь умножить два столбца в одной таблице на столбец в другой таблице на другом серверена основе кода продукта.

Я очень потерян!

Буду признателен за любую помощь

Спасибо.

Ответы [ 3 ]

3 голосов
/ 17 мая 2011

Вам необходимо использовать псевдонимы таблиц в связанных таблицах

например,

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
3 голосов
/ 17 мая 2011

Похоже, вы используете связанные серверы.Как уже отмечалось, используйте псевдоним для таблицы или представления со связанного сервера, иначе вы получите ошибку «Не может быть связан идентификатор из нескольких частей».

Это ограничение на 4 части именования.Например, server.PopTables.dbo.Products.ProductCode состоит из пяти частей и выдаст ошибку.Однако SELECT products.ProductCode FROM server.PopTables.dbo.Products AS будет работать нормально.

Помните, что если связанный сервер является экземпляром, убедитесь, что вы заключили в скобки имя.Например, [SERVERNAME \ INSTANCENAME].Для меня это было настоящей проблемой, когда это случилось впервые.

1 голос
/ 17 мая 2011

Я бы хотел, чтобы один sp возвратил нужные вам данные со связанного сервера:

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

и либо использовал бы этот результат непосредственно из sp в вашем объединении, либо сохранил бы результат где-нибудь на сервере A и использовал бы этов вашем присоединении.Я бы не стал запрашивать связанную таблицу больше, чем должен был.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...