添加后无法更新新列

时间:2012-04-22 14:02:03

标签: sql sql-server sql-server-2008

给出以下SQL:

IF EXISTS (SELECT * FROM sys.columns WHERE name = 'NewFieldName' AND object_id = OBJECT_ID('dbo.MyTableName'))
    RETURN

-- Add NewFieldName column to part of the Summer 2012 release cycle.
ALTER TABLE dbo.[MyTableName] ADD
    [NewFieldName] SmallINT NOT NULL
        CONSTRAINT DF_MyTableName_NewFieldName DEFAULT (2)

UPDATE [MyTableName] SET NewFieldName = 1 WHERE [Name] = 'FindMe' --Update one specific value

产生以下错误消息:

  

消息207,级别16,状态1,行10无效的列名称   'NewFieldName'。

我确定我遗漏了一些基本的东西,但是在alter之后尝试放置“GO”会使UPDATE每次都运行并且我不想这样做。

如何构造此语句,以便它检查列是否存在,如果它不添加它,然后按照我的UPDATE语句中的说明设置值?

1 个答案:

答案 0 :(得分:22)

添加新列后,需要编译引用新列的语句。执行此操作的一种方法是将其作为具有EXEC的子批处理运行。

IF NOT EXISTS (SELECT * 
               FROM   sys.columns 
               WHERE  name = 'NewFieldName' 
                      AND object_id = OBJECT_ID('dbo.MyTableName')) 
BEGIN
  -- Add NewFieldName column to part of the Summer 2012 release cycle. 
  ALTER TABLE dbo.[MyTableName] 
           ADD [NewFieldName] SMALLINT NOT NULL 
           CONSTRAINT DF_MyTableName_NewFieldName DEFAULT (2) 

  EXEC(' UPDATE [MyTableName] SET NewFieldName = 1 WHERE [Name] = ''FindMe''') 
END

它最初适用于你的原因可能是因为编译批处理时表本身并不存在,这意味着它中引用表的所有语句都需要延迟编译。