2012-01-06 6 views
1

Serveur MS SQL 2008 r2L'identificateur en plusieurs parties n'a pas pu être lié

Création d'une fonction SQL utilisant une variable de table. Il continue à lancer une erreur lorsque j'essaie de créer la fonction. Il se plaint soit que j'ai besoin de déclarer la variable scalaire @LocationUpdate, ou si j'utilise un alias de table LU il se plaint que l'identificateur de plusieurs parties lu.ID ne peut pas être lié.

Quelqu'un sait ce que je fais mal? J'ai une instruction sql avant celle-ci qui insère dans la variable de la table et ne jette aucune erreur sur celle-ci. J'ai le sentiment que je fais quelque chose de stupide - évident mais je ne le vois pas.

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 

Répondre

2

Dans sélectionner une partie de votre nom d'enclose de requête de votre var entre crochets ou utiliser la table aliasing

Supports

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 

Alias ​​

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 

ET

Essayez également de déballer vos jointures et utiliser TOP 1 (pour la clarté) où assigner à une variable

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

Et ne se mélangent pas implicite et explicite des jointures. Peut-être la raison pour laquelle leur tentative d'utiliser un alias mentionné dans la question n'a pas fonctionné. –

+1

J'ai frappé le chapeau de réputation pour aujourd'hui, donc, s'il vous plaît, révoquez-moi demain 8-) –

+0

s'il vous plaît, revotez-moi, si elle encore votre opinion 8-) –

3

jointures explicites ont préséance sur rejoint par des virgules. Dans votre requête, vous joignez effectivement LocationUpdateHistory à Location seul, pas à une jointure croisée de @LocationUpdate et Location, par conséquent, vous ne pouvez pas référence lu.

Une solution possible consiste à remplacer la virgule jointe par CROSS JOIN, puis l'alias lu sera accessible dans votre clause ON.

Mais vous avez besoin probablement aussi de fournir une condition pour adhérer à Location avec LocationUpdateHistory et/ou @LocationUpdate avec Location.

On dirait que vous avez déjà toutes les conditions nécessaires, seulement vous les gardez dans la clause WHERE. Donc, il suffit de convertir la virgule se joindre à + WHERE dans une autre jointure explicite:

... 
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

Merci, je vais essayer cela plus tard et voir comment ça se passe. – merk

Questions connexes