这类似于上一个问题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
。
答案 0 :(得分:2)
运行更新:
.. 组 OldValue = CASE WHEN ISNUMERIC(Oldvalue)= 1然后Oldvalue ELSE NULL END ...
运行
ALTER TABLE dbo.Mytable ALTER COLUMN OldValue int - 根据需要添加NULL或NOT NULL
答案 1 :(得分:2)
首先执行此操作:
更新表集字段= null其中ISNUMERIC(字段)= 0
然后更改类型
答案 2 :(得分:2)
经过一个小时的黑客攻击并在其他答案的指导下,这就是我的想法:
清理数据以确保信息转换。由于没有IsInteger函数,因此请使用IsNumeric设置为NULL
任何根本无法转换的内容。
将所有剩余数据转换为MONEY
类型,这将有效摆脱先前IsNumeric
接受的货币符号。
将货币类型转换为整数以摆脱分数。
最后,更改数据类型。
以下测试演示了如何使用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