2009-08-18 97 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