3
我有下面的代码示例:子查询中包含一个错误 - 但sql语句继续
create table #tempmembers (
memberid int
)
update Members set
Member_EMail = NULL
where Member_ID in (select member_id from #tempmembers)
的子查询中包含一个错误,因为#tempmembes
不包含名为member_id
列,但SQL语句运行没有任何错误并且不更新行。
如果我再补充一点一行到#tempmembers
:
create table #tempmembers (
memberid int
)
insert into #tempmembers select 1
update Members set
Member_EMail = NULL
where Member_ID in (select member_id from #tempmembers)
它仍然运行没有任何错误 - 但这次是在成员的所有记录都将受到影响。
为什么SQL语句没有完全失败?而如果没有子选择进行评估,以NULL - 应该在更新中Members
所有行不仅发生,如果那是:
update Members set
Member_EMail = NULL
where Member_ID not in (select member_id from #tempmembers)
超:S 为什么母鹿它这样做?是MS试图变得更好,并让我们避免不加前缀的彩色 - 然后打开这发生? – 2011-05-31 13:49:08
它可能是一个陷阱,最好总是在子查询中有资格; http://msdn.microsoft.com/en-us/library/ms178050.aspx – 2011-05-31 13:54:02
这是因为在这种情况下,列名称在完整查询中是唯一的,所以不会引发错误。问为什么外层查询确实需要返回自己的列?我不确定,但也许有一个例子,你真的需要这样的逻辑。 MS SQL决定它是这样的查询。 – Dalex 2011-05-31 13:56:22