程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 發現SQL SERVER 2005 的子查詢(Subquery)有個BUG,很有可能無意中造成重大損失

發現SQL SERVER 2005 的子查詢(Subquery)有個BUG,很有可能無意中造成重大損失

編輯:關於SqlServer

發現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)

 

 懇請高手告訴我為什麼會發生這種情況。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved