给出以下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语句中的说明设置值?
答案 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
它最初适用于你的原因可能是因为编译批处理时表本身并不存在,这意味着它中引用表的所有语句都需要延迟编译。