2009-09-30 15 views
11

Próbuję zaktualizować kolumnę wewnątrz zmiennej tabeli na podstawie warunku, przy czym warunek zmiennej tabeli nie istnieje w innej tabeli:Używanie zmiennej tabeli wewnątrz instrukcji istniejącej

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) 

Kiedy próbuję skompilować procedurę, która ma te oświadczenia, dostaję komunikat „musi zadeklarować zmienną skalarną«@BugRep».

Jak mogę iść o użyciu zmiennej tabeli wewnątrz klauzuli NOT EXISTS ?

Używam programu SQL Server 2 008

Odpowiedz

13

to będzie działać:

[@BugRep].BUGCODE 

Będziesz też trzeba zmienić "b.CODE" na "b.BUGCODE" przy okazji;)

7

To jest rzeczywiście bardzo wybredna . Sprawdź poniższe komentarze w wierszu, korzystając z sugestii womp, a także próbując 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, dobry kod przykładowy –

+2

Człowieku .. jaki jest denerwujący, co? +1 – womp

+0

ah, @BugCode, używany jako alias, jest nieprawidłowym identyfikatorem bez nawiasów. oczywiście! –

1

Oto wersja dwóch poprzednich wykorzystaniem aliasów obejść problemu:

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

ten sposób unika się również nieefektywności związane z „nie jest pusta” i „nie istnieje”.

Powiązane problemy