2016-04-25 99 views
0

我正在处理各种与其数据类型混淆的遗留数据库。有列应该是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语句在获取值时不会失败,如果它是十六进制值。

+3

快速版本是:'ISNUMERIC'不是确定值是否可以转换为'INT'的可靠方法。你使用的是什么版本的SQL Server? – Siyual

+1

这是一篇很好的文章,解释ISNUMERIC的一些缺陷。 http://www.sqlservercentral.com/articles/ISNUMERIC%28%29/71512/ –

+0

这些值应该是十六进制?因为'ISNUMERIC'将您的示例解释为科学记号编号'299999 * 10^0' – Stavr00

回答

0

为什么不使用TRY_CONVERT?如果它可以创建一个INT,否则它将返回NULL。

+0

当你有足够的声望时,请使用“添加注释”来显示你的个人建议,谢谢 –

+0

@ Brian-N:好主意,但我在MS SQL 2008上,根据[MSDN](https: //msdn.microsoft.com/en-us/library/hh230993.aspx)。 –