2012-10-09 38 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)+') 当我这样做时,它运行良好。 –