将sql列从varchar转换为bit并保留数据

时间:2016-01-17 13:35:54

标签: sql sql-server database bit varchar

我在Sql Server中有一个遗留表,其中varchar(5)列可以是truefalse

我想运行一个脚本,基本上将列类型更改为位,然后检查数据并将true值更改为1,将其他所有值更改为0列。

如果重要,表格非常小​​。谁能帮我一把?

2 个答案:

答案 0 :(得分:2)

我会分三步进行转换,如下所示:

  1. 添加位列
  2. 使用单个UPDATE
  3. 复制数据
  4. 删除varchar(5)
  5. 以下是实现此方法的示例脚本:

    create table test(flag varchar(5));
    insert into test(flag) values ('true'), ('false'), (null);
    -- #1: Add a bit column
    alter table test add fbit bit;
    -- #2: Copy data using a single `UPDATE`
    UPDATE test
    SET fbit = CASE
            WHEN flag = 'true' THEN 1 
            WHEN flag = 'false' THEN 0
            ELSE NULL 
        END
    -- #3: Drop the varchar(5) column
    ALTER TABLE test DROP COLUMN flag
    

    Demo.请注意,SQLFiddle为位列打印truefalse,但实际数据有点,而不是'true' / 'false'字符串。

答案 1 :(得分:0)

处理比特可能会很痛苦。以下适用于数字类型,但我不确定它是否适用于位:

update t
    col = (case when col = 'true' then 1 else 0 end);

alter table t
    alter column col bit;

此外,您可以将字符串“true”和“false”直接转换为位,因此如果这些是唯一值,则以下内容应该有效:

alter table t
    alter column col bit;

如果这不起作用,那么其他选项是:

  • 请改用tinyint。
  • 添加位列并进行设置。然后删除原始列并重命名位列。
  • 将数据保存到临时表中,删除原始表,使用适当的数据结构重建数据并重新加载数据。