2015-12-17 13 views
0

为什么ISNUMERIC = 0会返回带空格和'/'的数字? 这是SQL Server 2008 R2的BTWVARCHAR上的ISNUMERIC列返回数字还是?

谢谢你们,

代码示例:

SELECT A AS 'VARCHARCOLUMN' FROM TABLE 
    WHERE ISNUMERIC(A) = 0 

    TABLE Structure: 
    ---------------------- 
     A | B | C | 
    ---------------------- 
     x |  |  | 
     . |  |  | 
     p |  |  | 
    1 7/2 |  |  | 
    15. |  |  | 
     5 |  |  | 


     Result set: 
    ---------------------- 
     A | B | C | 
    ---------------------- 
     x |  |  | 
     p |  |  | 
    1 7/2 |  |  | <- Why is this returned??? 
+1

空格在数字上无效。你真的觉得这令人惊讶吗? –

+0

[ISNUMERIC()']的各种问题(http://web.archive.org/web/20051025015615/http://www.aspfaq.com/show.asp?id=2390),除了正如其他人所解释的那样,空格和斜线在一些数字中是无效的。将您的数字存储在一列中,将非数字值存储在另一列中,这样可以消除大部分头痛...... –

回答

0

SQL Server中的IsNumeric函数只在表达式是有效的数值类型时才返回true。它不明白表达是1和7八分之一。它认为这是一个字符串。 MSDN IsNumeric Reference

+2

好吧,更准确地说,表达式可以转换为任何有效的数字类型。以'SELECT ISNUMERIC('1e2');'为例 - 这个返回1,但是'SELECT CONVERT(INT,'1e2');'产生一个错误。改为使用'FLOAT'。 –

+0

解决此问题执行以下操作: SELECT A AS'VARCHARCOLUMN'FROM TABLE WHERE ISNUMERIC(SUBSTRING(A,1,1))= 0 –

+0

一旦开始使用SQL Server 2012,您可能需要考虑[ TRY_CAST'](https://msdn.microsoft.com/en-us/library/hh974669.aspx),它与'CAST'类似,但会安静地返回NULL,而不是在投射失败时产生错误。这可以使转换代码更加流畅。 –

0

因为这些都不被认为是数字。值'1 7/2'不是数字值 - 它是一个字符串(斜杠和空格是非数字的)。

+0

该空间有点不相关。 'ISNUMERIC('1')'评估为'1'。 – Gerrat

+0

我意识到,然而,第一个字符是一个数字,不会返回结果集,因为这...也许我的答案应该是解析列为1个字符,然后使用ISNUMERIC ...我会试试这个 –

+4

@格拉特我不同意。这两个都产生0:'SELECT ISNUMERIC('1 2'),ISNUMERIC('');'* outer *空格被修剪的事实是无关紧要的--OP没有外部空间,它们在中间有空格的字符串,这是不一样的事情。 –