2009-08-18 52 views
3

我有一个SQL脚本,我正在处理,并且在创建(或编辑)列时遇到问题,然后尝试修改该新列。SQL Alter Table然后修改值

例如:“无效的列名称ColumnThree'”

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块会分离这两个项目,但我得到一个错误当我试图运行这个。为什么?不应该第一个BEGIN/END设置ColumnThree以及更多的IF(如果该列名不存在,EXISTS应该保护UPDATE语句不被运行)

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

回答

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 

如果你使用多个模式,你会想要t o通过sys.schemas进入检查,以及。

+1

INFORMATION_SCHEMA.COLUMNS非常适合检查列是否存在 – 2009-08-18 13:00:28

+2

@Russ:您将自己的便携式解决方案留给自己! :) – Eric 2009-08-18 13:04:35

+0

完美,非常感谢......也可以作为(在事件中有第一个BEGIN/END多个项目): BEGIN \t ALTER TABLE SampleTable ADD ColumnThree诠释\t END GO IF( EXISTS(SELECT * FROM sys.columns WHERE name ='ColumnThree')) BEGIN \t UPDATE SampleTable SET ColumnThree = 0 END – ChrisHDog 2009-08-18 13:05:04