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

3

我在将数据库中所有 ntext 类型的表列进行转换时遇到了问题。我编写了以下查询语句以更改我的列,但出现了语法错误:

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

尽管SELECT MAX(DATALENGTH(mycolumn)) FROM mytable返回了正确的数字,但是查询无法执行。
语法错误如下:

varchar内部出现关键字'select'时,语法不正确。

我该怎么解决这个问题?

ntext 转换为 varchar 可能会导致数据丢失,您需要使用 nvarchar 吗? - Martin Smith
嗨马丁,是的,我正在尝试将我的表中的所有列从ntext转换为varchar(max_of_length_of_column)。在我的情况下,数据丢失会发生吗? - Jama A.
因为ntext是双字节的,而varchar(在大多数排序规则下)是单字节的,所以并不是所有字符都可以被表示。 - Martin Smith
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)

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


0

我担心你不能在ALTER COLUMN语句中执行此操作。至少我从未见过。

你应该这样做:

计算该列中的最大数据长度(你已经在做这个):

SELECT MAX(DATALENGTH(mycolumn)) FROM mytable

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

ALTER TABLE mytable ALTER COLUMN mycolumn VARCHAR(MAXVALUEFROMPREVIOUSQUERY);

谢谢您的回复,但我不能按照您所说的去做。因为查询应该是动态的,我无法为我的数据库执行此操作,因为它有很多列。 - Jama A.

0

尝试中:

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

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

谢谢你,@Zenofo,但我已经尝试过这种方法了。但它并没有很好地工作。 - Jama A.
请查看@james-curtis的答案,使用DECLAREEXEC来运行SQL查询。 - Koerr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接