如何防止内部选择表达式中的SQL Server错误(使用"IN"和"EXISTS"关键字)

Mer*_*rta 2 sql sql-server syntax-error sql-in

我有两个不同的表,其中包含不同的列,如下所示:

CREATE TABLE T1(C1 INT)
CREATE TABLE T2(C2 INT)
Run Code Online (Sandbox Code Playgroud)

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

SELECT C1 FROM T2 
--ERROR: Invalid column name 'C1'.
Run Code Online (Sandbox Code Playgroud)

但是如果我们使用这个错误的查询作为内部选择,不幸的是SQL会执行它:

SELECT * 
FROM T1
WHERE C1 IN (SELECT C1 FROM T2) 
--returns all rows of T1
Run Code Online (Sandbox Code Playgroud)

并且还会执行以下错误查询并返回所有行 T1

SELECT * 
FROM T1
WHERE EXISTS (SELECT C1 FROM T2) 
--returns all rows of T1
Run Code Online (Sandbox Code Playgroud)

当我们使用这些错误的查询时会变得更糟UPDATE:

UPDATE T1
SET C1 = NULL
WHERE C1 IN (SELECT C1 FROM T2) 
--updates all rows of T1
Run Code Online (Sandbox Code Playgroud)

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

Pரத*_*ீப் 6

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

我相信你一定见过这样的问题

SELECT * FROM T1 
WHERE EXISTS (SELECT 1 FROM T2 where t1.c1 = t2.c2) 
Run Code Online (Sandbox Code Playgroud)

这里C1列来自T1于被称为Where条款,你是指在Select这就是区别.这里没有BUG


ta.*_*.is 5

有没有系统的方法来防止这个错误?

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