3

我有一个正在处理的 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 语句不被运行。

做这样的事情的正确方法是什么?(我似乎有几个类似的场景需要这样做)。

4

1 回答 1

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检查。

于 2009-08-18T12:53:43.783 回答