3

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

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

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

语法错误是:

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

我该如何解决这个问题?

4

3 回答 3

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)

这样做的好处是您可以循环查找所有 ntext 列并将它们转换为 varchar sys.objectssys.columns

于 2012-10-04T15:59:54.833 回答
0

我担心你不能在ALTER COLUMN声明中这样做。至少我从来没有见过这个。

你应该这样做:

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

SELECT MAX(DATALENGTH(mycolumn)) FROM mytable

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

ALTER TABLE mytable ALTER COLUMN mycolumn VARCHAR(MAXVALUEFROMPREVIOUSQUERY);
于 2012-10-04T15:57:06.480 回答
0

试:

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

ALTER TABLE mytable ALTER COLUMN mycolumn VARCHAR(@maxLength);
于 2012-10-04T15:59:29.847 回答