SQL 即使位于带有 IN 标记的 where 子句中的子查询中存在错误,服务器仍删除了记录

SQL Server deleted records even though there was an error in the subquery which located in where clause with IN tag

正如您从这些图像中看到的,ROSHEADERID 列无效,当我执行第一个时,它 returns 是一条有意义的消息。但是当我在 where 子句中使用这个查询作为子查询时。它在没有警告或中止操作的情况下执行并删除所有记录。

这怎么可能?

子查询可以访问外部查询中的列,因此您请求的列 ROSHEADERID 实际上是从 EXM_REVIEWOFSYSTEMS 中获取的(而不是从 EXM_REVIEWOFSYSTEMSHEADER 中获取的),因此删除了外部查询中的所有记录table.

这应该能稍微澄清幕后发生的事情:

http://sqlfiddle.com/#!2/623c7/3

这里有更多信息:http://technet.microsoft.com/en-us/library/ms187638(v=sql.105).aspx

为表使用别名以避免冲突:

BEGIN TRAN
   DELETE   FROM EXM_REVIEWOFSYSTEMS
   WHERE    ROSHEADERID IN ( SELECT rsh.ROSHEADERID
                             FROM   EXM_REVIEWOFSYSTEMSHEADER rsh
                             WHERE  rsh.PATIENTID = '' )
   ROLLBACK TRAN