20

给定以下 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”。

我确定我错过了一些基本的东西,但是尝试在更改之后放置“GO”会使 UPDATE 每次都运行,我不想那样做。

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

4

1 回答 1

27

您需要在添加新列后编译引用新列的语句。这样做的一种方法是将其作为子批次运行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

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

于 2012-04-22T14:44:27.213 回答