5

我可以使用單個存儲過程向表中添加新列並處理列後續字嗎?例如,我有以下存儲過程:在存儲過程中添加一列

... 

alter table tb1 
add col1 varchar(1) null 

insert into tb1(col1) 
values ('Y') 

我得到了一個錯誤說

COL1是無效的。

+0

難道你執​​行添加列後去命令? – Muthukumar

+5

您不能在存儲過程中出現'GO'語句 – LittleBobbyTables

+0

SQL Server在創建proc時檢查該列是否存在,因此您必須手動添加該列,創建proc,然後刪除該列以獲得此工作。我會建議@LittleBobbyTables添加的動態SQL解決方法,儘管可能使用'sp_executesql'來代替。 –

回答

11

嘗試使用默認值'Y'創建表,而不是之後插入值。

alter table tb1 add col1 varchar(1) not null DEFAULT ('Y') 

您需要在兩條線之間GO已經在表中創建,按照該GO文檔:

SQL Server實用解釋GO作爲一個信號,他們應該派現批將Transact-SQL語句添加到SQL Server的實例。

但是,在存儲過程中不能有GO語句。

編輯

或者,你可以使用EXEC語句來執行代碼:

EXEC ('alter table tb1 add col1 varchar(1) null') 
EXEC ('update tb1 set col1 = ''Y''') 
+0

我只是舉一個例子,在現實中,我有很多其他的東西要做的存儲過程。我只是想知道是否必須在商店程序外改變表格? – GLP

+0

@GaolaiPeng - 請參閱我的編輯 – LittleBobbyTables

+1

一般來說,更改存儲過程之外的表是一個更好的選擇。每次teh proc運行時你真的想添加一列嗎?或者只添加一次?你應該將所有結構變化保存爲SQl腳本並放入源代碼控制,以便將它們移動到prod或在anotehr服務器上重新創建數據庫。 – HLGEM