11

I am trying to update a column inside of a table variable based on a condition, the condition being that the ID of the table variable does not exist in a different table:

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)

When i try to compile the procedure that has these statements, I get a "Must declare the scalar variable "@BugRep" message.

How do i go about using the table variable inside of the NOT EXISTS clause?

I am using SQL Server 2008

3 Answers 3

13

This will work:

[@BugRep].BUGCODE

You'll also need to change "b.CODE" to "b.BUGCODE" by the way ;)

Sign up to request clarification or add additional context in comments.

Comments

7

This is actually very picky. Check out the in-line comments below using womp's suggestion and also trying a 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

2 Comments

Man.. how annoying is that, eh? +1
ah, @BugCode, used as an alias, is an invalid identifier without the brackets. of course!
1

Here's a version of the previous two using aliases to get around your issue:

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

This also avoids the inefficiencies related to "is not null" and "not exists".

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.