T-SQL在子查询格式错误时删除表中的所有行

时间:2012-01-11 14:52:47

标签: sql-server sql-server-2008 tsql

  

可能重复:
  sql server 2008 management studio not checking the syntax of my query

我今天遇到了一个问题,其中子查询不好,结果是父表中的所有行都被删除了。

TableA
ID,
Text,
GUID

TableB
ID,
TableAID,
Text

delete from TableB
where id in (
  select TableAID
  from TableA
  where GUID = 'fdjkhflafdhf'
)

如果您自己运行子查询,则会收到错误,因为表A中不存在列(TableAID)。如果运行完整查询 - 它会删除表B中的所有记录而不会出现错误。

我还尝试了以下查询删除了0条记录(预期)

delete from TableB where id in (null) 
delete from TableB where id in (select null)

有人可以解释为什么在查询格式错误时会发生这种情况吗?为什么它似乎评估为真?

注意:这是在SQL Server 2008 R2上测试的

1 个答案:

答案 0 :(得分:4)

由于TableAID中不存在TableA,查询正在使用TableB中的列。因此查询与以下内容相同:

delete from TableB
where id in (
  select TableB.TableAID
  from TableA
  where GUID = 'fdjkhflafdhf'
)

所以从本质上说它正在做:

delete from TableB
where id in (TableAID)

如果您使用子查询,最好在引用时提及您的表名。以下 WILL 会抛出异常:

 delete from TableB
    where id in (
      select TableA.TableAID
      from TableA
      where TableA.GUID = 'fdjkhflafdhf'
    )

此外,我会使用别名,以便我们知道我们所指的是哪个查询:

 delete from TableB
    where id in (
      select a.TableAID
      from TableA a
      where a.GUID = 'fdjkhflafdhf'
    )