2009-09-30 16 views
11

テーブル変数のIDが異なるテーブルに存在しないという条件に基づいて、テーブル変数の内部の列を条件に基づいて更新しようとしています。existsステートメント内でテーブル変数を使用する

DECLARE @BugRep TABLE(BugCode VARCHAR(50),DevFirstName VARCHAR(50), DevLastName VARCHAR(50), BugDate VARCHAR(20), IsValid VARCHAR(1)) 

UPDATE @BugRep 
SET IsValid = 'N' WHERE NOT EXISTS(SELECT * FROM BUG b WHERE @BugRep.BUGCODE = b.CODE) 

私はこれらの文を持って手続きをコンパイルしようとすると、私は「スカラー変数を宣言する必要があります 『@BugRep』というメッセージが表示されます。私は、NOTの内部でテーブル変数を使用して行くのですがEXISTS句をどのように

私はSQL Server 2を使用しています008

答えて

13

これは動作します:

[@BugRep].BUGCODE 

をあなたはまた、方法によって "b.BUGCODE" に "b.CODE" を変更する必要があります;)

7

これは実際には非常にうるさいです。 wompの提案を使って、以下のインラインコメントをチェックして、LEFT OUTER JOINを試してみてください。

CREATE TABLE Bug (CODE VARCHAR(50)) 

DECLARE @BugRep TABLE (
    BugCode   VARCHAR(50), 
    --DevFirstName VARCHAR(50), 
    --DevLastName  VARCHAR(50), 
    --BugDate   VARCHAR(20), 
    IsValid   CHAR(1) 
) 

INSERT INTO Bug (CODE) VALUES ('Code1'), ('Code2'), ('Code3') 

INSERT INTO @BugRep (BugCode) VALUES ('Code1'), ('Code2'), ('Code4') 

SELECT CODE FROM Bug ORDER BY CODE 
SELECT BugCode, IsValid FROM @BugRep ORDER BY BugCode 

UPDATE @BugRep       -- Can't be [@BugRep] ("Invalid object name '@BugRep'.") 
SET IsValid = 'N' 
WHERE NOT EXISTS (
    SELECT * 
    FROM BUG b 
    WHERE [@BugRep].BUGCODE = b.CODE -- Can't be @BugRep ("Must declare the scalar variable "@BugRep".") 
) 

SELECT BugCode, IsValid FROM @BugRep ORDER BY BugCode 

UPDATE @BugRep       -- Can be either @BugRep or [@BugRep] 
SET IsValid = 'Y' 
FROM @BugRep       -- Can't be [@BugRep] ("Invalid object name '@BugRep'.") 
LEFT OUTER JOIN BUG 
ON [@BugRep].BUGCODE = BUG.CODE   -- Can't be @BugRep ("Must declare the scalar variable "@BugRep".") 
WHERE BUG.CODE IS NOT NULL 

SELECT BugCode, IsValid FROM @BugRep ORDER BY BugCode 

DROP TABLE Bug 
GO 
+0

+1、良いサンプルコード –

+2

男..どのように迷惑なのですか? +1 – womp

+0

ah、エイリアスとして使用される@BugCodeは、角括弧なしの無効な識別子です。もちろん! –

1

ここにあなたの問題を回避するためにエイリアスを使用して、以前の2のバージョンです:

UPDATE @BugRep 
SET IsValid = 'N' 
FROM @BugRep BR 
    LEFT JOIN BUG B 
     ON BR.BUGCode = B.CODE 
WHERE B.CODE is null 

また、これは、「ヌルではありません」と「存在しない」に関連する非効率性を回避することができます。

関連する問題