我对 SQL 查询有一个非常奇怪的问题。
IF NOT EXISTS ([special query here])
BEGIN
SELECT 1;
END
ELSE
BEGIN
SELECT 2;
END
上面的查询输出:2。
但是,当我用SELECT 1;
包含创建表等的大型查询替换该部分时,会引发多个错误。SQL Server 怎么可能在IF
语句的情况下执行代码,而这种情况不正确?
我对 SQL 查询有一个非常奇怪的问题。
IF NOT EXISTS ([special query here])
BEGIN
SELECT 1;
END
ELSE
BEGIN
SELECT 2;
END
上面的查询输出:2。
但是,当我用SELECT 1;
包含创建表等的大型查询替换该部分时,会引发多个错误。SQL Server 怎么可能在IF
语句的情况下执行代码,而这种情况不正确?
如果您正在更改模式,解析器将在运行之前查看所有实体是否存在。
ALTER TABLE myTable ADD aNewColumn INT
UPDATE myTable SET aNewColumn = 0
这将产生错误。
只要您不从客户端获取参数,您就可以使用动态 sql。
EXEC sp_executesql N'UPDATE myTable SET aNewColumn = 0'
语法错误是语法错误,无论您是在将运行的条件分支还是不会运行的条件分支中。解析发生在执行之前,并且必须成功。
考虑这个用 C++ 编写的类似示例:
int main()
{
if (false) {
acbukasygdfukasygdaskuygdfas#@4r9837y214r
}
}
即使它在一个永远不会运行的块内,你也不能写那句废话,因为程序的预期含义不能由编译器确定。