我正在处理一个SQL脚本,当我创建(或编辑)一个列然后尝试修改该新列时,我遇到了一个问题。
例如:
BEGIN
ALTER TABLE SampleTable ADD ColumnThree int
END
IF (EXISTS (SELECT * FROM sys.columns WHERE name = 'ColumnThree'))
BEGIN
UPDATE SampleTable SET ColumnThree = 0
END
现在我认为BEGIN / END块会将这两个项目分开,但是我收到错误“无效的列名'ColumnThree'。”当我试图运行它。为什么?第一个BEGIN / END不应该设置ColumnThree以及IF(EXISTS应该保护UPDATE语句在该列名称不存在时运行。)
这样做的正确方法是什么? (我似乎有几个类似的情况需要这样做。)
答案 0 :(得分:6)
您需要GO
,而不是BEGIN/END
。此外,您可能需要稍微编辑EXISTS
查询,以确保您获得正确的表格:
ALTER TABLE SampleTable ADD ColumnThree int
GO
IF (EXISTS
(SELECT 1
FROM
sys.columns c
INNER JOIN sys.tables t ON
c.object_id = t.object_id
WHERE
t.name = 'SampleTable'
AND c.name = 'ColumnThree'))
BEGIN
UPDATE SampleTable SET ColumnThree = 0
END
如果您使用多个架构,您也需要通过sys.schemas
进入支票。