11

条件に基づいてテーブル変数内の列を更新しようとしています。条件は、テーブル変数のIDが別のテーブルに存在しないことです。

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)

これらのステートメントを含むプロシージャをコンパイルしようとすると、「スカラー変数を宣言する必要があります」というメッセージが表示されます。

NOT EXISTS句内でテーブル変数を使用するにはどうすればよいですか?

SQLServer2008を使用しています

4

3 に答える 3

13

これは機能します:

[@BugRep].BUGCODE

ちなみに「b.CODE」を「b.BUGCODE」に変更する必要もあります;)

于 2009-09-30T16:20:43.507 に答える
7

これは実際には非常にうるさいです。womp の提案を使用して、以下のインライン コメントを確認し、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
于 2009-09-30T17:06:07.900 に答える
1

問題を回避するためにエイリアスを使用する前の2つのバージョンを次に示します。

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

これにより、「nullではない」および「存在しない」に関連する非効率性も回避されます。

于 2009-09-30T19:28:40.240 に答える