使用数据修改列类型,而不删除数据

mez*_*hic 15 sql sql-server sql-server-2008

我有一个我相信被错误宣布的专栏.它包含数据,我不希望丢失数据.

我希望将定义从varchar(max)更改为varchar(整数).我的印象是我不能只改变列类型?

创建临时列的最佳方法是"column2",将数据传输到此列,从有问题类型的列中删除问题列,然后将temp列重命名为原始有问题的列?

如果是,如何将问题列中的值复制到新列?

编辑:对于同一个问题的人,你可以只使用ALTER语句.

mar*_*c_s 23

只要数据类型有点"相关" - 是的,你绝对可以这样做.

您可以INT将a 更改为BIGINT- 第二种类型的值范围更大,因此您不会"丢失"任何数据.

您可以将a更改VARCHAR(50)VARCHAR(200)- 再次,类型兼容,大小越来越大 - 没有截断任何内容的风险.

基本上,你只需要

ALTER TABLE dbo.YourTable
ALTER COLUMN YourColumn VARCHAR(200) NULL
Run Code Online (Sandbox Code Playgroud)

管他呢.只要你没有超过200个字符的任何字符串,你就可以了.不确定如果确实有更长的字符串会发生什么 - 转换会因错误而失败,或者它会继续并告诉您某些数据可能已被截断.所以我建议你先在你的数据副本上试试这个:-)

它变得有点棘手,如果你需要更改VARCHAR到一个INT或类似的东西-很显然,如果你有列值不"适合"进入新的类型,则转换失败.但即使使用单独的"临时"新列也无法解决这个问题 - 你需要以某种方式处理那些"不兼容"的情况(忽略它们,在那里留下NULL,将它们设置为默认值 - 某些东西).

此外,之间的切换VARCHAR以及NVARCHAR从一种类型到另"默认"的转换在转换时,你可能会失去某些条目,因为它们无法在其他格式来表示,或者-可能很麻烦,如果你有,例如非西欧字符没有按预期工作.