SQL“无效列”错误和条件

时间:2015-02-16 21:17:10

标签: sql sql-server

我有以下代码:

IF EXISTS (SELECT COLUMN_NAME, TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'BusinessDays' AND TABLE_NAME = 'Populations')
BEGIN
    ALTER TABLE Populations 
    ADD EndDay int NOT NULL DEFAULT (5)

    UPDATE Populations 
    SET EndDay = BusinessDays - 1

    ALTER TABLE Populations 
    DROP COLUMN BusinessDays
END

我第一次运行代码时效果很好,但是如果我再次运行它,我会得到:

  

无效的列名称'BusinessDays'。

我需要查询才能运行多次而不会出错。条件应该(并且确实)阻止代码执行,但为什么我会收到此错误?正确使用此代码的正确方法是什么?感谢。

2 个答案:

答案 0 :(得分:6)

您收到此错误是因为SQL Server将尝试解析整个批处理,包括在条件语句中,并且在缺少的列引用时将失败。

修复它的最简单方法是将违规引用放在子范围内,只有在IF语句的计算结果为真时才编译和执行。

IF EXISTS (SELECT *
           FROM   INFORMATION_SCHEMA.COLUMNS
           WHERE  COLUMN_NAME = 'BusinessDays'
                  AND TABLE_NAME = 'Populations')
  BEGIN
      EXEC('ALTER TABLE Populations
              ADD EndDay INT NOT NULL DEFAULT (5)

            UPDATE Populations
            SET    EndDay = BusinessDays - 1

            ALTER TABLE Populations
              DROP COLUMN BusinessDays')
  END 

答案 1 :(得分:0)

DROP从表定义中ping整个列,这意味着在后续运行时它将不再存在。

您可能需要考虑将字段值设置为NULL,同时使用WHERE子句来标识要更新的记录。