2009-09-30 11 views
11

Sto cercando di aggiornare una colonna all'interno di una variabile di tabella basata su una condizione, la condizione di essere che l'ID della variabile tabella non esiste in una tabella diversa:Utilizzando una variabile di tabella all'interno di una esiste dichiarazione

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) 

Quando provo a compilare la procedura che ha queste affermazioni, ricevo un messaggio "deve dichiarare la variabile scalare '@BugRep'.

Come posso fare per usare la variabile di tabella all'interno della clausola NOT EXISTS ?

Sto usando SQL Server 2 008

risposta

13

Questo funziona:

[@BugRep].BUGCODE 

avrete anche bisogno di cambiare "b.CODE" a "b.BUGCODE" a proposito;)

7

Questo è in realtà molto schizzinosi . Dai un'occhiata ai commenti in linea sotto usando il suggerimento di womp e anche provando un ESCLUSIVO SINISTRO.

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, codice di esempio valido –

+2

Man .. quanto è fastidioso, eh? +1 – womp

+0

ah, @BugCode, utilizzato come alias, è un identificatore non valido senza parentesi. ovviamente! –

1

Ecco una versione delle due precedenti che utilizzano pseudonimi per aggirare il problema:

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

Questo evita anche le inefficienze legate alla "non è nulla" e "non esiste".

Problemi correlati