2010-06-14 38 views

回答

2

你必須在那裏您連接的列名作爲參數收到撰寫動態DDL SQL語句

CREATE PROCEDURE AddColumnToTable 
    @columnName VARCHAR(128) 
AS 
EXEC ('ALTER TABLE tableName ADD' + SPACE(1) + @columnName + SPACE(1) + 'VARCHAR(MAX) NULL') 

注意,在這個例子中,表的名稱以及該列的類型在SQL語句中被硬編碼爲。您可能需要考慮將作爲參數添加到存儲過程以獲得更通用的解決方案。

相關資源:

1

這是一般一個可怕的想法。如果您的模式需要更改需要由sp完成的表,那麼它們發生得太頻繁,應該審查設計。

但是如果你被這個可怕的過程所困住(我不能強調它真的是一個壞主意)。那麼你也需要爲數據的數據類型輸入一個pvalue,如果需要,數據類型的大小可以爲空,varchar(max)對於添加每個可能的列都是不好的選擇。只有當您希望列中的索引超過8000個字符時才應使用它。

爲什麼這樣不好?首先,你已經失去了對schena的控制。人們可以做任何事情,沒有任何審查,以確保你沒有得到十二個版本的相同的東西,添加了不同的名字。接下來你如何修改應用程序以使用這些字段而不知道添加了什麼?既然你不應該返回比你需要的更多的字段,你的生產代碼不應該使用select *。因此,如果您的用戶添加了這些字段,您怎麼知道要添加哪些字段。一般用戶不夠豐富,無法添加字段。他們不瞭解數據庫結構或設計,也不瞭解如何規範化和調整性能。讓人們無處不在地爲數據表添加字段是短視的,並且會導致數據庫性能不佳以及尷尬,難以使用的接口,這些接口會讓客戶煩惱。如果你在設計數據庫和應用程序時已經做好了你的工作,那麼用戶需要添加的東西應該很少。如果你的工作基礎是用戶能夠靈活地添加,那麼你就會遇到一個項目的災難,這個項目不僅難以維護,而且性能也不好,一般你的用戶會討厭它。我被迫與這些可怕的商業產品一起工作(看看Clarity,如果你想要一個例子,說明flexibilty如何超越設計並製造出幾乎不可用的產品)。