代码之家  ›  专栏  ›  技术社区  ›  Adrian

更改数据库列类型,同时忽略使用SQL的转换错误

  •  1
  • Adrian  · 技术社区  · 15 年前

    这与前面的问题类似 MSSQL: Change type of a column with numbers from varchar to int ,除非在这种情况下,不是所有的原始数据都可以成功地从varchar转换为int NULL

    例如,varchar列中传入的一组值如下所示: {'123', '234', '345', 'A', '456'} . 在从varchar转换为int之后,我希望列包含这些值 {123, 234, 345, NULL, 456} . 实际上,我会有99%的成功率。

    编辑:The IsNumeric 建议确实弥补了一部分差距,但并不完整。例如,如果数据集包含数值数据而不是整数数据,则 修复不起作用(而且似乎没有 IsInteger ). 特别是,根据sqlserver,下面的集合不会转换{'123.456','$12'},因为它们都是数字 是数字的 Int

    3 回复  |  直到 8 年前
        1
  •  2
  •   gbn    15 年前
    1. 运行更新以便:

      .. OldValue=大小写,如果是数值(OldValue)=1,则OldValue否则为空结尾 ...

    2. 更改表格dbo.Mytable公司ALTER COLUMN OldValue int—根据需要添加NULL或NOT NULL

        2
  •  2
  •   johnnycrash    15 年前
    1. 首先执行此操作:

      update table set field=null,其中ISNUMERIC(field)=0

        3
  •  2
  •   Adrian    15 年前

    1. 清理数据以确保信息可以转换。由于没有IsInteger函数,请使用IsNumeric设置为 NULL 任何不能转换的东西。

    2. 将所有剩余数据转换为类型 MONEY 这将有效地消除以前被接受的货币符号 IsNumeric .

    3. 最后,更改数据类型。

    CREATE TABLE tbl ( 
        id INTEGER IDENTITY NOT NULL,
        col VARCHAR(20)
    )
    
    INSERT INTO tbl (col) VALUES ('123')
    INSERT INTO tbl (col) VALUES ('ABC')
    INSERT INTO tbl (col) VALUES ('123.456')
    INSERT INTO tbl (col) VALUES ('$12')
    
    UPDATE tbl SET col = CASE WHEN IsNumeric(col) = 1 THEN Convert(INTEGER, (Convert(MONEY, col))) ELSE NULL END
    ALTER TABLE tbl ALTER COLUMN col INTEGER
    
    SELECT * FROM tbl