我正在处理各种与其数据类型混淆的遗留数据库。有列应该是integers
,但保存为varchar(9)
。我正在创建表格的新版本并尝试正确导入整数值。我有需要被转换为int的字段如下声明:SQL Server isnumeric将varchar视为十六进制值,但不会更改为int
CASE
ISNUMERIC(fieldname)
WHEN 0 THEN NULL
ELSE CAST(fieldname AS int) AS fieldname
,保持跳闸这件事是值:029999E00
。
错误是:转换VARCHAR值 '029999E00' 为int类型时
转换失败。
大多数时候,这个工程很好,会给我一个有效的int值或NULL。
为什么ISNUMERIC
说这个值是int,但是CAST
无法转换它?我也试过bigint
,我得到了同样的结果。是否有另一种方法来检查这样的值?
还有一篇关于使用ISNUMERIC作为解决方案的文章,但ISNUMERIC在这种情况下不起作用。我需要另一个选项来检查一个数值,或者确保CAST语句在获取值时不会失败,如果它是十六进制值。
快速版本是:'ISNUMERIC'不是确定值是否可以转换为'INT'的可靠方法。你使用的是什么版本的SQL Server? – Siyual
这是一篇很好的文章,解释ISNUMERIC的一些缺陷。 http://www.sqlservercentral.com/articles/ISNUMERIC%28%29/71512/ –
这些值应该是十六进制?因为'ISNUMERIC'将您的示例解释为科学记号编号'299999 * 10^0' – Stavr00