Что такое «многокомпонентный идентификатор» и почему его нельзя связать? - PullRequest
115 голосов
/ 16 октября 2008

Я постоянно получаю эти ошибки, когда пытаюсь обновить таблицы на основе другой таблицы. В итоге я переписываю запрос, изменяю порядок объединений, меняю некоторые группировки, и в конце концов это работает, но я просто не совсем понимаю.

Что такое «многокомпонентный идентификатор»?
Когда «многокомпонентный идентификатор» не может быть связан?
С чем это связано в любом случае?
В каких случаях произойдет эта ошибка?
Каковы наилучшие способы предотвратить это?

Конкретная ошибка в SQL Server 2005:

Не удалось связать многоэлементный идентификатор "...".

Вот пример:

UPDATE  [test].[dbo].[CompanyDetail]

SET Mnemonic = [dbBWKMigration].[dbo].[Company].[MNEMONIC], 
               [Company Code] = [dbBWKMigration].[dbo].[Company].[COMPANYCODE]

WHERE [Company Name] = **[dbBWKMigration].[dbo].[Company].[COMPANYNAME]**

Фактическая ошибка:

Сообщение 4104, уровень 16, состояние 1, строка 3 Идентификатор, состоящий из нескольких частей Не удалось связать «dbBWKMigration.dbo.Company.COMPANYNAME».

Ответы [ 17 ]

1 голос
/ 11 марта 2019

При вводе таблицы FROM эти ошибки исчезнут. Введите FROM ниже того, что вы печатаете, тогда Intellisense будет работать, и будет работать многокомпонентный идентификатор.

1 голос
/ 05 февраля 2019

Я получал эту ошибку и просто не мог понять, в чем проблема. Я дважды проверил все свои псевдонимы и синтаксис, и ничто не выглядело неуместным. Запрос был похож на те, которые я пишу все время.

Я решил просто переписать запрос (я изначально скопировал его из файла отчета .rdl) ниже, снова, и он работал нормально. Глядя на запросы сейчас, они выглядят одинаково для меня, но мой переписанный работает.

Просто хотел сказать, что, возможно, стоит попробовать, если больше ничего не работает.

1 голос
/ 23 ноября 2018

Добавление псевдонима таблицы перед полем Set вызывает эту проблему в моем случае.

правый Обновить таблицу1 Установите SomeField = t2.SomeFieldValue Из таблицы 1 т1 Внутреннее соединение Table2 как t2 На t1.ID = t2.ID

Неправильный Обновить таблицу1 Установите t1.SomeField = t2.SomeFieldValue Из таблицы 1 т1 Внутреннее соединение Table2 как t2 На t1.ID = t2.ID

1 голос
/ 09 марта 2018

Мой лучший совет при наличии ошибки - использовать [] скобки для сортировки имен таблиц, сокращение таблиц иногда приводит к ошибкам (иногда сокращения таблиц работают просто отлично ... странно)

1 голос
/ 17 января 2018

Код ошибки

FROM                
    dbo.Category C LEFT OUTER JOIN           
    dbo.SubCategory SC ON C.categoryID = SC.CategoryID AND C.IsActive = 'True' LEFT OUTER JOIN          
    dbo.Module M ON SC.subCategoryID = M.subCategoryID AND SC.IsActive = 'True' LEFT OUTER JOIN          
    dbo.SubModule SM ON M.ModuleID = SM.ModuleID AND M.IsActive = 'True' AND SM.IsActive = 'True' LEFT OUTER JOIN 
    dbo.trainer ON dbo.trainer.TopicID =dbo.SubModule.subModuleID 

Код решения

 FROM                
    dbo.Category C LEFT OUTER JOIN           
    dbo.SubCategory SC ON C.categoryID = SC.CategoryID AND C.IsActive = 'True' LEFT OUTER JOIN          
    dbo.Module M ON SC.subCategoryID = M.subCategoryID AND SC.IsActive = 'True' LEFT OUTER JOIN          
    dbo.SubModule SM ON M.ModuleID = SM.ModuleID AND M.IsActive = 'True' AND SM.IsActive = 'True' LEFT OUTER JOIN 
    dbo.trainer ON dbo.trainer.TopicID = SM.subModuleID 

Как вы можете видеть, в коде ошибки dbo.SubModule уже определено как SM, но я использую dbo.SubModule в следующей строке, следовательно, произошла ошибка. используйте объявленное имя вместо фактического имени. Проблема решена.

1 голос
/ 05 сентября 2017

Я действительно забыл присоединить таблицу к остальным, поэтому я получил ошибку

Предполагается, что это так:

  CREATE VIEW reserved_passangers AS
  SELECT dbo.Passenger.PassName, dbo.Passenger.Address1, dbo.Passenger.Phone
  FROM dbo.Passenger, dbo.Reservation, dbo.Flight
  WHERE (dbo.Passenger.PassNum = dbo.Reservation.PassNum) and
  (dbo.Reservation.Flightdate = 'January 15 2004' and Flight.FlightNum =562)

И не так:

  CREATE VIEW reserved_passangers AS
  SELECT dbo.Passenger.PassName, dbo.Passenger.Address1, dbo.Passenger.Phone
  FROM dbo.Passenger, dbo.Reservation
  WHERE (dbo.Passenger.PassNum = dbo.Reservation.PassNum) and
  (dbo.Reservation.Flightdate = 'January 15 2004' and Flight.FlightNum = 562)
1 голос
/ 26 июня 2017

у меня было P.PayeeName AS 'Payer' --, и две строки комментариев выкинули эту ошибку

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