SQL Server 2005 IsNumeric 未捕获“0310D45”

Posted

技术标签:

【中文标题】SQL Server 2005 IsNumeric 未捕获“0310D45”【英文标题】:SQL Server 2005 IsNumeric Not catching '0310D45' 【发布时间】:2010-04-12 20:06:20 【问题描述】:

我有这个值'0310D45'

在转换为 bigint 之前,我使用 isumeric 来检查值是否为数字。不幸的是,这个值通过了数字检查。所以我的查询失败了:

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

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

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

谢谢

【问题讨论】:

【参考方案1】:

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

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

不幸的是,IsNumeric 看起来很奇怪,您必须编写几行 T-SQL 才能绕过它。 (奇怪我的意思是如果评估的数据可以转换为任何数字类型,它就会被转换。)

【讨论】:

【参考方案2】:

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

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

第二种解决方案是将字符串 'e0' 连接到您的测试字符串,并且仍然使用 SQLServer 函数 ISNUMERIC() 和连接的字符串。 ISNUMERIC 无法检测到 d、e、x 等字符的存在,因为数字格式中使用了不同的符号,但它仍然只允许单个字符。因此,连接 'e0' 可以防止函数在需要时给你一个 false true。

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

希望对你有帮助

【讨论】:

【参考方案3】:

查看SO question 以获得 SQL Server ISNUMERIC() 的几个替代建议。

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

【讨论】:

以上是关于SQL Server 2005 IsNumeric 未捕获“0310D45”的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver判断字符串是否是数字

sqlserver判断字符串是否是数字

SQL Server 中几个有用的特殊函数

哪里能下载到SQL server 2005?

已安装 SQL Server 2005,安装 SQL Server 2008 时提示需要删除 SQL Server 2005 Express 工具

SQL Server 2005 异常