2011-05-02 34 views
0

我使用生成的SQL腳本(sql 2k5)將一列添加到表中。如果列不存在alter table

我需要添加一個「檢查是否存在」,因爲我的客戶有時運行腳本兩次。 (我在這個部分沒有控制權,這是發生了一遍又一遍)

我找到了一種方法加入的sysobjects和syscolumns中,它的工作原理。

我的問題是,我有一個列添加到其他表,其中列不是在表的末尾。

對於這一個,SQL是生成長碼...創建新的臨時表的新列中,從舊錶填滿,刪除舊錶,並最終改名臨時表。

的這裏的問題是,這一個劇本有很多GO的出現-s與交易一起...

我能做些什麼?

1)刪除所有GO - S? (不喜歡這個主意)

2)加入我的IF之間的每一個GO對? (不喜歡這個主意)

3)是否有有意義的其它方式,它不會太難實現

我想不出什麼真的,我可以檢查的發行版本,或者其他任何東西,不僅僅是我的sysobjects和syscolumns加入,但問題將是相同的。

因爲GO-S,我如果將被「遺忘」當它到達的開始結束...

回答

0

它們如何運行腳本(因爲您使用的是支持GO批處理分隔符的工具) - SQL CMD?

我會考慮把它全部放在一個字符串中並使用EXEC。幾個DDL命令必須是批處理中的第一個命令。此外,有時可以遇到解析問題:

ALTER TABLE Executing regardless of Condition Evaluational Results

此外,您可能想看看SQLCMD的控制功能http://www.simple-talk.com/sql/sql-tools/the-sqlcmd-workbench/

+0

聽起來很有趣。會嘗試,會讓你知道 – Ash 2011-05-02 13:25:43

7

我不知道我跟着你的問題的全部,但你會檢查是否存在如下所示的列:

if not exists (select * from information_schema.columns 
       where table_name = '[the tables name]' 
       and column_name = '[column name') 
begin 
--alter table here 
end 

爲什麼要擔心列的序號位置?新的列會得到一個新的colid並附加到「結尾」,這不會導致任何問題。

如果您通過發送這些腳本來進行頻繁更新,那麼我會創建一個版本表並在腳本的開頭查詢。

+0

不可能的。列順序設置(數百表是相同的,他們必須是相同的) – Ash 2011-05-02 13:22:00

+1

看起來像你有更大的(設計)問題,而不僅僅是添加一些列...也許你應該首先修復相關的代碼,不使用選擇和插入沒有明確的列名單等? – Arvo 2011-05-02 13:44:59

+0

僅供參考當然,「結束」與磁盤結構無關。請參閱http:// stackoverflow。com/questions/5839459/sql-server-performance-and-order-of-fields/5840669#5840669 – gbn 2011-05-02 13:57:45