导航

 发现SQL SERVER 2005 的子查询(Subquery)有个BUG,差点造成重大损失,还好是在dev环境。不知道有没有人提过。

建立测试环境如下:

CREATE TABLE SubQueryBug
(
  ID1 INT 
);

insert SubQueryBug select 1;
insert SubQueryBug select 2;
insert SubQueryBug select 3;
insert SubQueryBug select 4;
insert SubQueryBug select 5;
insert SubQueryBug select 6;
insert SubQueryBug select 7;
insert SubQueryBug select 8;
insert SubQueryBug select 9;
insert SubQueryBug select 10;

CREATE TABLE SubQueryBug2
(
  ID2 INT 
);
INSERT SubQueryBug2 SELECT 1
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)

 

 恳请高手告诉我为什么会发生这种情况。