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

时间:2009-06-18 06:01:33

标签: sql sql-server tsql types

这类似于上一个问题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%。

虽然一般解决方案是理想的,但我使用的是SQL Server 2005,需要在Transact SQL中执行更改。

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

3 个答案:

答案 0 :(得分:2)

  1. 运行更新:

    .. 组     OldValue = CASE WHEN ISNUMERIC(Oldvalue)= 1然后Oldvalue ELSE NULL END ...

  2. 运行

    ALTER TABLE dbo.Mytable ALTER COLUMN OldValue int - 根据需要添加NULL或NOT NULL

答案 1 :(得分:2)

  1. 首先执行此操作:

    更新表集字段= null其中ISNUMERIC(字段)= 0

  2. 然后更改类型

答案 2 :(得分:2)

经过一个小时的黑客攻击并在其他答案的指导下,这就是我的想法:

  1. 清理数据以确保信息转换。由于没有IsInteger函数,因此请使用IsNumeric设置为NULL任何根本无法转换的内容。

  2. 将所有剩余数据转换为MONEY类型,这将有效摆脱先前IsNumeric接受的货币符号。

  3. 将货币类型转换为整数以摆脱分数。

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

  5. 以下测试演示了如何使用SQL:

    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