SQL Server 2005 IsNumeric无法捕获'0310D45'

时间:2010-04-12 20:06:20

标签: sql sql-server sql-server-2005

我有这个值'0310D45'

我正在使用isnumeric来检查在转换为bigint之前值是否为数字。不幸的是,这个值正在通过isnumeric检查。所以我的查询没有说:

Msg 8114, Level 16, State 5, Line 3
Error converting data type varchar to bigint.

处理此问题的最简单方法是什么。我正在考虑使用charindex,但我必须检查所有26个字母。

我有没有看到一个简单的解决方案?我真的不想创建用户定义的函数。

由于

3 个答案:

答案 0 :(得分:9)

看看这篇名为What is wrong with IsNumeric()?的文章,其中包含以下摘要:

  

摘要: T-SQL的ISNUMERIC()函数存在问题。它可以错误地解释   非数字字母和符号(例如D,E和£),甚至是标签   (CHAR(9))为数字。

不幸的是,看起来IsNumeric看起来很奇怪,你必须编写几行T-SQL来解决它。 (通过怪异的我的意思是,如果评估的数据可以转换为任何数字类型,它将被转换。)

答案 1 :(得分:4)

我最近遇到了这个问题,正在寻找解决方案。我想我找到了两个,并希望将它们发布在这里,以便其他人更容易找到。 第一种解决方案是使用正则表达式和SQLServer函数PATINDEX()

IF PATINDEX('%[^0-9]%', @testString) = 0

第二个解决方案是连接字符串' e0'到你的测试字符串,仍然使用带有连接字符串的SQLServer函数ISNUMERIC()。由于数字格式中使用的符号不同,ISNUMERIC无法检测到d,e,x等字符的存在,但它仍然只允许单个字符。因此,连接' e0'在需要时阻止函数给出错误的真实。

IF (ISNUMERIC (@testString + 'e0') = 1)

希望这有帮助

答案 2 :(得分:2)

有关SQL Server ISNUMERIC()的几个替代建议,请查看此SO question

我相信他的愿望清单上也有Erland has this as a connect item - 他称之为is_valid_convert()。