2012-01-06 110 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

相关问题