我在数据库中转换ntext
类型的所有表列时遇到问题。我写这个查询是为了改变我的列,但是有一个语法错误:
ALTER TABLE mytable ALTER COLUMN mycolumn
VARCHAR(SELECT MAX(DATALENGTH(mycolumn)) FROM mytable);
即使SELECT MAX(DATALENGTH(mycolumn)) FROM mytable
返回正确的数字,也无法执行查询。
语法错误是:
关键字'select'附近的语法不正确。(位于
varchar
)
我该如何解决这个问题?
答案 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.objects
和sys.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);