sql-server - 即使条件不成立,T-Sql 似乎也在评估 "If"语句

标签 sql-server tsql if-statement

我有一个 T-Sql 脚本,其中该脚本的一部分检查表中是否存在特定列。如果是这样,我希望它执行一个例程...如果不是,我希望它绕过这个例程。我的代码如下所示:

IF COL_LENGTH('Database_Name.dbo.Table_Name', 'Column_Name1') IS NOT NULL
    BEGIN
        UPDATE Table_Name
            SET Column_Name2 = (SELECT Column_Name3 FROM Table_Name2
                WHERE Column_Name4 = 'Some Value')
            WHERE Column_Name5 IS NULL;

        UPDATE Table_Name
            SET Column_Name6 = Column_Name1
            WHERE Column_Name6 IS NULL;
    END

我的问题是,即使 Column_Name1 的 COL_LENGTH 为空(意味着它不存在),我仍然收到一条错误消息,告诉我 IF 语句中的第二个 UPDATE 语句“无效的列名 'Column_Name1'”。由于某种原因,即使条件为 FALSE,此 IF 条件仍在评估,我不知道为什么。

最佳答案

SQL Server 解析该语句并验证它,忽略任何 if 条件。这就是为什么以下也失败的原因:

IF 1 = 1
BEGIN
  CREATE TABLE #foo(id INT);
END
ELSE
BEGIN
  CREATE TABLE #foo(id INT);
END

无论您点击“执行”还是只是“解析”,都会导致:

Msg 2714, Level 16, State 1
There is already an object named '#foo' in the database.

SQL Server 不知道也不关心将输入条件的哪个分支;无论如何,它都会验证批处理中的所有语句。您可以执行以下操作(由于延迟名称解析):

IF <something>
BEGIN
  SELECT foo FROM dbo.Table_That_Does_Not_Exist;
END

但你不能这样做:

IF <something>
BEGIN
  SELECT column_that_does_not_exist FROM dbo.Table_That_Does;
END

解决方法通常是使用动态 SQL:

IF <something>
BEGIN
  DECLARE @sql NVARCHAR(MAX);
  SET @sql = N'SELECT column_that_does_not_exist FROM dbo.Table_That_Does;';
  EXEC sp_executesql @sql;
END

关于sql-server - 即使条件不成立,T-Sql 似乎也在评估 "If"语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19822843/

相关文章:

sql-server - 如何在 SQL Server 中进行增量加载

sql - 如何在 SQL SELECT 中执行 IF...THEN?

sql-server - 一个存储过程中的多个单独的 SQL 查询

php - 由于单引号无法将字符串插入数据库

javascript - 基于 HTML 下拉选择填充输入

sql-server - SQL Server 动态重置运行余额

c++ - 我似乎无法弄清楚我的代码出了什么问题,我无法获得输出

jsf - 使用三元运算符实现EL中的else if - jsf

php - 添加 PHP 条件时 CSS 不适用于 div

sql 获取日期中的特定时间