2012-10-09 59 views
2

我試圖創建一個腳本,它在對一個數據庫運行時需要一列並將其設置爲NOT NULL。SQL Server:當列大小未知時將varchar設置爲非空

該列應該是一個VARCHAR(50),如果我知道它沒有改變,這將是一塊蛋糕,但是,我不能確定沒有人改變了長度,所以我需要確保我不會減小列的大小,例如,如果其他人已將其增加到100列。

我希望我可以做這樣的事情,但它似乎不工作(假設我已經確信沒有NULL值):

DECLARE @myColumnLength INT 

SET @myColumnLength = (
    SELECT character_maximum_length 
    FROM information_schema.columns 
    WHERE table_name = 'mytable' 
    AND column_name = 'mycolumn' 
) 

ALTER TABLE mytable 
    ALTER COLUMN mycolumn VARCHAR(@myColumnLength) NOT NULL 

任何想法?我是否以錯誤的方式攻擊了這個問題?看起來合乎邏輯的是,如果不更改列大小,將會有一種方法將列設置爲NOT NULL,但我的Google-fu今天正在失敗。

回答

3

您可以EXEC創建一個動態的語句並執行它:

DECLARE @myColumnLength INT 

SET @myColumnLength = (
    SELECT character_maximum_length 
    FROM information_schema.columns 
    WHERE table_name = 'mytable' 
    AND column_name = 'mycolumn' 
) 

DECLARE @cmd VARCHAR(1000) 
SET @cmd = 'ALTER TABLE mytable ALTER COLUMN mycolumn VARCHAR(' + @myColumnLength + ') NOT NULL' 

EXEC (@cmd) 
+0

我想你的解決方案,但它似乎我不得不把INT轉換爲VARCHAR這樣的: mycolumn VARCHAR('+ CONVERT( VARCHAR(4),@ myColumnLength)+') 當我這樣做時,它運行良好。 –