如何防止内部 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]
。
我有两个不同的表,它们的不同列如下:
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]
。