我有以下代码:
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'。
我需要查询才能运行多次而不会出错。条件应该(并且确实)阻止代码执行,但为什么我会收到此错误?正确使用此代码的正确方法是什么?感谢。
答案 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
子句来标识要更新的记录。