当列中已有数据时,是否可以更改列的数据类型

时间:2015-11-08 17:07:54

标签: sql sql-server sql-server-2008 alter-table

例如对于列(xx),其中数据类型是varchar并且在其中具有值,例如'cons','alts'将其转换为int ... 如果不可能这样做我们有什么其他选择

1 个答案:

答案 0 :(得分:0)

更新后的值。像这样:

update t
    set column = NULL
    where column not like '%[^0-9]%' or column not like '-[^0-9]%';

alter t alter column int;

一旦值有效,您应该能够修改类型,假设列上有许多其他条件(涉及在约束中使用等)。

编辑:

如果要创建引用表,通常会添加新列。这很糟糕,因为列重新排序。所以,你可以使用这个hack:

create table columnRef (
    columnRefId int not null identity primarykey,
    value varchar(255) unique
);

insert into columnRef(value)
    select distinct column from t;

alter table t add newvalue varchar(255);

update t newvalue = column;

update t
    column = cast(columnRefId as varchar(255))
    from t join
         columnRef cr
         on t.newvalue = cr.value;

alter t modify column int;

alter t drop newvalue;

写完这篇文章后,我意识到你不需要newvalue。但是,不知怎的,我很难修改用于join的列中的数据,并且之后无法检查其准确性。