2012-01-06 74 views
1

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

在你的VAR的查詢的封裝名稱選擇部分爲方括號或使用表別名

支架

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 

嘗試也解開你的連接和使用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 
+0

並且也不要混合隱式和顯式連接。可能是他們嘗試使用問題中提到的別名不起作用的原因。 – 2012-01-06 19:27:25

+1

今天我已經達到了聲望上限,所以,請明天再提醒我8-) – 2012-01-06 19:53:54

+0

請復我,如果它仍然是你的意見8-) – 2012-01-07 05:32:13

3

明確連接的優先級高於逗號連接。在您的查詢中,您單獨有效地加入LocationUpdateHistoryLocation,而不是交叉加入@LocationUpdateLocation,因此您不能引用lu

一個可能的解決方案是用CROSS JOIN替換逗號加入,然後lu別名將在您的ON子句中可訪問。

但你可能也需要與LocationUpdateHistory和/或@LocationUpdateLocation加入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 
+0

謝謝,我稍後再嘗試一下,看看它是怎麼回事。 – merk 2012-01-07 23:26:47

相關問題