發現SQL Server 2005 的子查詢(Subquery)有個BUG,差點造成重大損失,還好是在dev環境。不知道有沒有人提過。
建立測試環境如下:
01
CREATE TABLE SubQueryBug
02
(
03
ID1 INT
04
);
05
06
insert SubQueryBug select 1;
07
insert SubQueryBug select 2;
08
insert SubQueryBug select 3;
09
insert SubQueryBug select 4;
10
insert SubQueryBug select 5;
11
insert SubQueryBug select 6;
12
insert SubQueryBug select 7;
13
insert SubQueryBug select 8;
14
insert SubQueryBug select 9;
15
insert SubQueryBug select 10;
16
17
CREATE TABLE SubQueryBug2
18
(
19
ID2 INT
20
);
21
INSERT SubQueryBug2 SELECT 1
22
GO
執行如下查詢:
SELECT ID1 FROM SubQueryBug2
GO
系統理所當然返回錯誤,因為ID1在SubqueryBug2中不存在:
Msg 207, Level 16, State 1, Line 1
Invalid column name 'ID1'.
然後執行如下查詢:
SELECT * from SubQueryBug where ID1 in(select ID1 from SubQueryBug2)
GO
猜一猜會發生什麼?
你可能會說:ID1不在表變量中定義,SQL Server 會返回錯誤!
但是事實上,檢查語法一路綠燈。
你可能會說:即使錯了又怎麼樣,表變量中只有一條記錄。只會影響一條記錄。
但事實上呢?你去試一下就知道了。
如果你在2008裡試,請把結果告訴我,謝謝!
這種情況在你的查詢裡外層查詢跟內層查詢使用一樣列名的時候才會出現,但是你可能注意不到。
執行下面的語句吧。別怪我沒提醒過你。
DELETE from SubQueryBug where ID1 in(select ID1 from SubQueryBug2)
懇請高手告訴我為什麼會發生這種情況。