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

时间:2012-05-18 09:44:31

标签: sql sql-server sql-server-2008

我有一个我认为已被错误宣布的专栏。它包含数据,我不希望丢失数据。

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

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

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

编辑:对于有相同问题的任何人,您可以只使用ALTER语句。

4 个答案:

答案 0 :(得分:22)

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

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

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

基本上,你只需要

ALTER TABLE dbo.YourTable
ALTER COLUMN YourColumn VARCHAR(200) NULL

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

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

此外,如果你有例如VARCHARNVARCHAR之间切换可能会变得棘手非西欧字符 - 您可能会在转换时丢失某些条目,因为它们无法以其他格式表示,或者从一种类型到另一种类型的“默认”转换无法按预期工作。

答案 1 :(得分:2)

计算该表的该列的最大数据长度store。

Select max(len(fieldname)) from tablename

现在,您可以将该列的大小减小到上一次查询中得到的结果。

ALTER TABLE dbo.YourTable
ALTER COLUMN YourColumn VARCHAR(200) NULL

答案 2 :(得分:1)

根据PostgreSQL docs,你可以简单地alter table

ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);

但是这就是

  

只有当列中的每个现有条目都可以通过隐式转换转换为新类型时,才会成功。如果需要更复杂的转换,您可以添加一个USING子句,指定如何从旧值中计算新值。

答案 3 :(得分:0)

添加一个类型为varchar(NN)的temp column2,运行update tbl set column2 = column,检查是否有错误发生;如果一切正常,请更改原始列,复制数据并删除co​​lumn2。