无法将值分配给刚刚在表中创建的列

时间:2014-01-23 00:52:27

标签: sql sql-server-2005 sql-update

由于某些原因,当我运行它时,它会显示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

为什么我在创建它时无法更新它?

1 个答案:

答案 0 :(得分:3)

这是一个解析时错误 - SQL Server正在尝试将整个批处理验证为单个原子操作。它没有看到你添加一个具有该名称的列,它只知道没有一个具有该名称的列现在 - 它独立地评估它来自批处理中的所有其他语句。出于同样的原因,你不能这样做:

IF 1 = 1
  CREATE TABLE #t(i INT);
ELSE
  CREATE TABLE #t(y INT);

显然,你和我知道只会执行其中一个分支,但是从SQL Server获得的错误消息(已经有一个名为#t的对象)暗示它不能理解分支或排序。

避免这种情况的两种方法:

  1. 分批发布两个命令。如果您使用的是Management Studio,只需在GOALTER之间添加UPDATE即可。这将强制Management Studio按依赖顺序评估批次。或者更简单 - 突出显示ALTER,然后运行,然后突出显示UPDATE,然后运行它。

  2. 使用动态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;';