在SQL Server中将ntext列类型更改为varchar(n)

时间:2012-10-04 15:51:01

标签: sql sql-server-2008

我在数据库中转换ntext类型的所有表列时遇到问题。我写这个查询是为了改变我的列,但是有一个语法错误:

ALTER TABLE mytable ALTER COLUMN mycolumn 
VARCHAR(SELECT MAX(DATALENGTH(mycolumn)) FROM  mytable);

即使SELECT MAX(DATALENGTH(mycolumn)) FROM mytable返回正确的数字,也无法执行查询。

语法错误是:

  

关键字'select'附近的语法不正确。(位于   varchar

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:5)

您需要将其作为动态sql执行,因为列的大小不能是变量。

DECLARE @Length int = SELECT MAX(DATALENGTH(mycolumn)) FROM mytable
DECLARE @MyTable varchar(100) = 'mytable'
DECLARE @MyColumn varchar(100) = 'mycolumn'
DECLARE @SQL varchar(8000) = 'ALTER TABLE ' + @MyTable +' ALTER COLUMN '+ @MyColumn +' VARCHAR(' + CONVERT(varchar, @Length) + ')'
EXEC(@SQL)

这样做的好处是你可以遍历sys.objectssys.columns来查找所有ntext列并将它们转换为varchar。

答案 1 :(得分:0)

我担心你不能在ALTER COLUMN声明中做到这一点。至少我从未见过这个。

你应该这样做:

计算该列中的最大数据长度(您已经这样做了):

SELECT MAX(DATALENGTH(mycolumn)) FROM mytable

现在只需替换​​上一个查询中的值:

ALTER TABLE mytable ALTER COLUMN mycolumn VARCHAR(MAXVALUEFROMPREVIOUSQUERY);

答案 2 :(得分:0)

尝试:

SET @maxLength = SELECT MAX(DATALENGTH(mycolumn)) FROM mytable;

ALTER TABLE mytable ALTER COLUMN mycolumn VARCHAR(@maxLength);