2012-01-06 22 views
1

MS SQL Server 2008 r2複数の部分の識別子をバインドできませんでした

テーブル変数を使用するSQL関数を作成しようとしています。私は関数を作成しようとすると、エラーをスローし続けます。それは、スカラー変数@LocationUpdateを宣言する必要があると不平を言うか、またはテーブルエイリアスLUを使用すると、マルチパート識別子lu.IDがバインドできないという不満があります。

誰かが間違っていることを知っていますか?私はテーブル変数に挿入するこの1つ前の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

も加わり、暗黙的および明示を混在させないでください。質問に記載されたエイリアスを使用しようとする試みがうまくいかなかった理由かもしれません。 –

+1

私は今日の評判キャップを打ったので、明日私に改めて8-) –

+0

お願いします。もしあなたの意見がまだ残っていれば私を改めてください。 –

3

明示的には、カンマより優先が参加してい合流します。あなたの質問ではLocationUpdateHistoryLocationだけを参加させて、@LocationUpdateLocationのクロスジョインには参加しないので、luを参照することはできません。

カンマを「CROSS JOIN」に置き換えることが考えられます。luエイリアスは、ON句でアクセスできるようになります。

しかし、あなたはおそらくLocationLocationUpdateHistoryおよび/または@LocationUpdateLocationに参加するため、いくつかの条件を提供することも必要です。

あなたはすでにすべての必要条件を満たしているようですが、あなただけが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

関連する問題