2009-09-30 31 views
11

Tôi đang cố gắng cập nhật cột bên trong biến bảng dựa trên điều kiện, điều kiện là ID của biến bảng không tồn tại trong một bảng khác:Sử dụng biến bảng bên trong câu lệnh tồn tại

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) 

Khi tôi cố gắng để biên dịch các thủ tục có các báo cáo này, tôi nhận được một "phải khai báo các biến vô hướng '@BugRep' tin nhắn.

làm thế nào để tôi đi về việc sử dụng các biến bảng bên trong NOT EXISTS khoản ?

Tôi đang sử dụng SQL Server 2 008

Trả lời

13

này sẽ làm việc:

[@BugRep].BUGCODE 

Bạn cũng sẽ cần phải thay đổi "b.CODE" thành "b.BUGCODE" bằng cách này;)

7

Đây thực sự là rất kén cá chọn canh . Kiểm tra các bình luận trực tuyến bên dưới bằng cách sử dụng gợi ý của womp và cũng thử dùng 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 
+0

+1, mã mẫu tốt –

+2

Man .. làm thế nào gây phiền nhiễu là, eh? +1 – womp

+0

ah, @BugCode, được sử dụng làm bí danh, là số nhận dạng không hợp lệ không có dấu ngoặc đơn. tất nhiên! –

1

Dưới đây là một phiên bản của hai sử dụng bí danh trước để có được xung quanh vấn đề của bạn:

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

này cũng tránh được sự thiếu hiệu quả liên quan đến "không phải là vô giá trị" và "không tồn tại".

Các vấn đề liên quan