Не удалось связать идентификатор из нескольких частей - PullRequest
1 голос
/ 06 января 2012

MS SQL server 2008 r2

Попытка создать функцию sql, использующую переменную таблицы.Он продолжает выдавать ошибку, когда я пытаюсь создать функцию.Он либо жалуется на то, что мне нужно объявить скалярную переменную @LocationUpdate, либо, если я использую псевдоним таблицы LU, он жалуется на то, что многоэлементный идентификатор lu.ID не может быть связан.

Кто-нибудь знает, кто яделать неправильно?У меня есть оператор SQL перед этим, который вставляет в переменную таблицы, и он не выдает никаких ошибок по этому поводу.У меня такое чувство, что я делаю что-то глупое, очевидное, но я не вижу этого.

DECLARE @LocationUpdate TABLE (
[ID] [int] NOT NULL,
[FacilityName] [nvarchar](500) NULL,
[TrialUpdateID] [int] NOT NULL,
[StatusID] [int] NULL,
[City] [nvarchar](100) NULL,
[StateID] [int] NULL,
[Zip] [nvarchar](100) NULL,
[CountryID] [int] NULL,
[ContactName] [nvarchar](500) NULL,
[ContactPhone] [nvarchar](500) NULL,
[ContactPhoneExt] [nvarchar](500) NULL,
[ContactEmail] [nvarchar](500) NULL

)

SELECT @Return =
case when l.ContactFirstName +' ' +l.ContactLastName <> @LocationUpdate.ContactName then 1 else 0 END
+ CASE WHEN l.ContactEmail <> @LocationUpdate.ContactEmail THEN 1 ELSE 0 END
+ CASE WHEN l.ContactPhone <> @LocationUpdate.ContactPhone THEN 1 ELSE 0 END
+ CASE WHEN l.StatusID <> @LocationUpdate.StatusID THEN 1 ELSE 0 END
+ CASE WHEN l.Zip <> @LocationUpdate.Zip THEN 1 ELSE 0 END,
@Cleared = ISNULL(luh.Cleared, 0)
FROM @LocationUpdate lu, Location l
LEFT JOIN LocationUpdateHistory luh ON @LocationUpdate.ID = luh.idx
WHERE l.TrialID = @TrialID
AND l.City = @LocationUpdate.City
AND l.FacilityName = @LocationUpdate.FacilityName

Ответы [ 2 ]

3 голосов
/ 06 января 2012

Явные объединения имеют приоритет над запятыми. В своем запросе вы фактически объединяете LocationUpdateHistory в Location в одиночку, а не в перекрестное объединение @LocationUpdate и Location, поэтому вы не можете ссылаться на lu.

Одним из возможных решений является замена запятой на CROSS JOIN, тогда псевдоним lu будет доступен в вашем предложении ON.

Но вам, вероятно, также необходимо указать некоторые условия для соединения Location с LocationUpdateHistory и / или @LocationUpdate с Location.

Похоже, у вас уже есть все необходимые условия, только вы выполняете их в предложении WHERE. Итак, просто преобразуйте запятое соединение + WHERE в другое явное соединение:

...
FROM @LocationUpdate lu
  INNER JOIN Location l ON l.City = lu.City
                       AND l.FacilityName = lu.FacilityName
  LEFT JOIN LocationUpdateHistory luh ON lu.ID = luh.idx
WHERE l.TrialID = @TrialID
2 голосов
/ 06 января 2012

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

скобки

SELECT @Return =
case when l.ContactFirstName +' ' +l.ContactLastName <> [@LocationUpdate].ContactName then 1 else 0 END
+ CASE WHEN l.ContactEmail <> [@LocationUpdate].ContactEmail THEN 1 ELSE 0 END
+ CASE WHEN l.ContactPhone <> [@LocationUpdate].ContactPhone THEN 1 ELSE 0 END
+ CASE WHEN l.StatusID <> [@LocationUpdate].StatusID THEN 1 ELSE 0 END
+ CASE WHEN l.Zip <> [@LocationUpdate].Zip THEN 1 ELSE 0 END,
@Cleared = ISNULL(luh.Cleared, 0)
FROM @LocationUpdate , Location l
LEFT JOIN LocationUpdateHistory luh ON [@LocationUpdate].ID = luh.idx
WHERE l.TrialID = @TrialID
AND l.City = [@LocationUpdate].City
AND l.FacilityName = [@LocationUpdate].FacilityName

Псевдоним

SELECT @Return =
case when l.ContactFirstName +' ' +l.ContactLastName <> lu.ContactName then 1 else 0 END
+ CASE WHEN l.ContactEmail <> lu.ContactEmail THEN 1 ELSE 0 END
+ CASE WHEN l.ContactPhone <> lu.ContactPhone THEN 1 ELSE 0 END
+ CASE WHEN l.StatusID <> lu.StatusID THEN 1 ELSE 0 END
+ CASE WHEN l.Zip <> lu.Zip THEN 1 ELSE 0 END,
@Cleared = ISNULL(luh.Cleared, 0)
FROM @LocationUpdate lu, Location l
LEFT JOIN LocationUpdateHistory luh ON lu.ID = luh.idx
WHERE l.TrialID = @TrialID
AND l.City = lu.City
AND l.FacilityName = lu.FacilityName

AND

Попробуйте также развернуть ваши объединения и использовать TOP 1 (для ясности), где присваивать переменной

SELECT TOP 1 
  @Return =
case when l.ContactFirstName +' ' +l.ContactLastName <> lu.ContactName then 1 else 0 END
+ CASE WHEN l.ContactEmail <> lu.ContactEmail THEN 1 ELSE 0 END
+ CASE WHEN l.ContactPhone <> lu.ContactPhone THEN 1 ELSE 0 END
+ CASE WHEN l.StatusID <> lu.StatusID THEN 1 ELSE 0 END
+ CASE WHEN l.Zip <> lu.Zip THEN 1 ELSE 0 END,
@Cleared = ISNULL(luh.Cleared, 0)
FROM @LocationUpdate lu
JOIN Location l
  ON 
      l.City = lu.City
  AND l.FacilityName = lu.FacilityName
LEFT JOIN LocationUpdateHistory luh ON lu.ID = luh.idx
WHERE l.TrialID = @TrialID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...