由于某些原因,当我运行它时,它会显示Invalid column name 'col3'.
:
IF NOT EXISTS (SELECT name FROM SYS.COLUMNS WHERE name = 'col3' AND object_id IN (SELECT object_id
FROM SYS.TABLES WHERE name = 'table1')) BEGIN
ALTER TABLE table1 ADD col3 int
UPDATE table1 SET col3=col1+col2
END
但是,如果我先改变表格并在END
的{{1}}之后尝试更新IF
这样的值,那么它就可以了:
col3
为什么我在创建它时无法更新它?
答案 0 :(得分:3)
这是一个解析时错误 - SQL Server正在尝试将整个批处理验证为单个原子操作。它没有看到你要添加一个具有该名称的列,它只知道没有一个具有该名称的列现在 - 它独立地评估它来自批处理中的所有其他语句。出于同样的原因,你不能这样做:
IF 1 = 1
CREATE TABLE #t(i INT);
ELSE
CREATE TABLE #t(y INT);
显然,你和我知道只会执行其中一个分支,但是从SQL Server获得的错误消息(已经有一个名为#t的对象)暗示它不能理解分支或排序。
避免这种情况的两种方法:
分批发布两个命令。如果您使用的是Management Studio,只需在GO
和ALTER
之间添加UPDATE
即可。这将强制Management Studio按依赖顺序评估批次。或者更简单 - 突出显示ALTER
,然后运行,然后突出显示UPDATE
,然后运行它。
使用动态SQL执行更新。
IF NOT EXISTS (blah blah)
BEGIN
ALTER TABLE dbo.table1 ADD col3 INT;
END
EXEC dbo.sp_executesql N'UPDATE dbo.table1 SET col3 = col1 + col2;';