【问题标题】:is it possible to change data type of column when the column already has data in it当列中已有数据时,是否可以更改列的数据类型
【发布时间】:2015-11-08 17:07:53
【问题描述】:

例如对于列 (xx),其中数据类型为 varchar 并且其中包含诸如 'cons'、'alts' 之类的值以将其转换为 int... 如果不可能这样做,我们还有什么其他选择

【问题讨论】:

  • 不,cons, alts 无法转换为 INT。仅当可以将现有数据隐式转换到INT 时
  • 如果您有一个预定义的对应关系,即 cons=1 alts=2 等,如果您没有那么多值,则可能是可能的
  • 如果您不能进行隐式转换,您总是可以使用更新语句将数据更改为允许它的值 - 例如 cons = 1、ALTs = 2 等

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


【解决方案1】:

更新值后。像这样的:

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

alter t alter column int;

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

编辑:

如果你想创建一个引用表,通常你会添加一个新列。这很讨厌,因为列会重新排序。所以,你可以使用这个技巧:

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 的列中的数据感到不舒服,之后无法检查准确性。

【讨论】:

    猜你喜欢
    • 2012-05-29
    • 2020-04-15
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 2015-08-20
    • 2019-06-18
    • 2019-04-29
    相关资源
    最近更新 更多