SQL Alter Table然后修改值

Chr*_*Dog 3 sql alter-table

我有一个我正在处理的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
Run Code Online (Sandbox Code Playgroud)

现在我认为BEGIN/END块会将这两个项目分开,但是我收到错误"无效的列名'ColumnThree'." 当我试图运行它.为什么?第一个BEGIN/END不应该设置ColumnThree以及IF(EXISTS应该保护UPDATE语句在该列名称不存在时运行).

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

Eri*_*ric 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
Run Code Online (Sandbox Code Playgroud)

如果您使用多个模式,您也需要sys.schemas进入检查.

  • @Russ:您自己保留便携式解决方案!:) (2认同)
  • @Chris:不需要将它们包装在`begin ... end`中.他们只需要其他的声明(`while`,`if`等).`GO`将执行挂起的一批交易,无论它们是否包含在`begin ... end`中.话虽如此,如果`begin ... end`使你的代码更具可读性,一定要使用它! (2认同)