Verwenden einer Tabellenvariable innerhalb einer existierenden Anweisung
-
19-09-2019 - |
Frage
Ich versuche, eine Spalte innerhalb einer Tabellenvariable basierend auf einer Bedingung zu aktualisieren. Die Bedingung ist, dass die ID der Tabellenvariable in einer anderen Tabelle nicht vorhanden ist:
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)
Wenn ich versuche, die Prozedur mit diesen Aussagen zu kompilieren, erhalte ich eine "Muss die skalare Variable" @BuGREP "-Meldung.
Wie kann ich die Tabellenvariable innerhalb der nicht existierenden Klausel verwenden?
Ich verwende SQL Server 2008
Lösung
Das wird funktionieren:
[@BugRep].BUGCODE
Sie müssen auch übrigens "B.Code" in "B.Bugcode" ändern;)
Andere Tipps
Das ist eigentlich sehr wählerisch. Schauen Sie sich die Inline-Kommentare unten unter Verwendung von WOMPs Vorschlag an und versuchen Sie es auch mit einem linken äußeren 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
Hier ist eine Version der beiden vorherigen mit Aliase, um Ihr Problem zu umgehen:
UPDATE @BugRep
SET IsValid = 'N'
FROM @BugRep BR
LEFT JOIN BUG B
ON BR.BUGCode = B.CODE
WHERE B.CODE is null
Dies vermeidet auch die Ineffizienzen in Bezug auf "ist nicht null" und "nicht existiert".