为什么ISNUMERIC(',')是真的?

时间:2014-06-05 06:58:38

标签: sql sql-server-2008

为什么SQL中的以下Query返回true? 我希望它是假的,因为它无法转换为int或数值

select ISNUMERIC(',')

返回1 ???

select ISNUMERIC('0,1,2')

select ISNUMERIC(',,,')

也会返回1

如何在SQL中进行严格的数字检查?

4 个答案:

答案 0 :(得分:5)

因为ISNUMERIC回答了 nobody 曾经想要问的问题:

  

这个给定的字符串是否可以转换为任何的SQL Server数值数据类型?而且我不关心哪些类型它可以或不可以转换成。

这就是TRY_CONVERT最终引入2012年的原因 - 回答有关您可能关心的特定数据类型的问题。


对于早期版本,您通常可以做的最好的事情是使用LIKE来识别您想要转换的字符串模式。

E.g。如果您只是想检测数字,请使用Value NOT LIKE '%[^0-9]%',其中要求Value字符串包含数字的任何字符。

答案 1 :(得分:3)

IsNumeric returns true for "," and "."

  

如果字符串可以转换为整数,数字/小数,浮点数或货币中的任何一个,则ISNUMERIC返回1。在这种特殊情况下,转换',。'货币成功并返回0.0000,因此ISNUMERIC返回1.

Enhancement to ISNUMERIC

  

我们现在添加了一个名为TRY_CONVERT的新标量函数,它允许您使用可选样式从字符串转换为类型。如果转换失败,那么它将返回NULL。该功能的签名是:

TRY_CONVERT(data_type[(length)], expression [,style])

答案 2 :(得分:2)

http://msdn.microsoft.com/en-us/library/ms186272.aspx

微软:“这不是一个错误,它是一个功能”

某些货币和数学符号在ISNUMERIC上返回1。

答案 3 :(得分:2)

根据手册页:

对于某些非数字字符,例如加号(+),减号( - )和有效货币符号(如美元符号($)),ISNUMERIC返回1。此外,它为一系列数据类型返回1,如:

  • int
  • bigint
  • smallint
  • tinyint
  • 小数

因此,当bigint接受像230,000这样的货币值时,逗号(,)也属于字符集,该字符集被认为是数字数据类型的一部分,类似于点(。)这是一个字符但是是十进制数据类型的一部分。