11
votes

Utiliser une variable de table à l'intérieur d'une déclaration existante

J'essaie de mettre à jour une colonne à l'intérieur d'une variable de table basée sur une condition, la condition étant que l'ID de la variable de table n'existe pas dans une table différente: xxx

quand J'essaie de compiler la procédure qui a ces énoncés, je reçois un "doit déclarer la variable scalaire" @bugrep ".

Comment puis-je utiliser la variable de table à l'intérieur de la clause de non existure? < / p>

J'utilise SQL Server 2008


0 commentaires

3 Réponses :


13
votes

Cela fonctionnera:

[@BugRep].BUGCODE


0 commentaires

7
votes

Ceci est en fait très em> difficile. Consultez les commentaires en ligne ci-dessous à l'aide de la suggestion de la WOMP et essayez également une jointure extérieure gauche.

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 commentaires

Homme .. Dans quelle mesure est-ce ennuyant, hein? +1


Ah, @bugcode, utilisé comme alias, est un identifiant invalide sans crochets. bien sûr!



1
votes

Voici une version des deux précédents utilisant des alias pour contourner votre problème:

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


0 commentaires