如何防止内部 select 表达式中的 SQL 服务器错误(使用 'IN' & 'EXISTS' 关键字)

How to prevent SQL Server bug in inner select expression (using 'IN' & 'EXISTS' keywords)

我有两个不同的表,它们的不同列如下:

CREATE TABLE T1(C1 INT)
CREATE TABLE T2(C2 INT)

每个程序员都知道如果我们用错误的语法编写查询,查询编译器应该给我们一个错误。比如这个:

SELECT C1 FROM T2 
--ERROR: Invalid column name 'C1'.

但是如果我们将这个错误的查询用作内部 select,不幸的是 SQL 将执行它:

SELECT * 
FROM T1
WHERE C1 IN (SELECT C1 FROM T2) 
--returns all rows of T1

下面的错误查询也会执行 returns T1

的所有行
SELECT * 
FROM T1
WHERE EXISTS (SELECT C1 FROM T2) 
--returns all rows of T1

当我们在 UPDATE 中使用这些错误的查询时,情况会变得更糟,例如:

UPDATE T1
SET C1 = NULL
WHERE C1 IN (SELECT C1 FROM T2) 
--updates all rows of T1

现在,我想防止这个错误。我可以强迫我的数据库开发人员小心,但是有什么系统的方法可以防止这个错误吗?

听说过 Correlated Subquery,你总是可以在子查询中引用外部查询列

我相信你一定见过这样的查询

SELECT * FROM T1 
WHERE EXISTS (SELECT 1 FROM T2 where t1.c1 = t2.c2) 

T1 中的 C1 列在 Where 子句中引用,您在 Select 中引用这就是区别。这里没有BUG

Is there any systematic way to prevent this bug?

始终使用两部分名称 - [Table].[Column]