这是SQL Server中的错误吗?

时间:2018-02-10 08:51:25

标签: sql sql-server tsql

我在SQL Server中遇到了一个问题,我认为这是一个错误 - 但我不确定。

我的用户输入了一个负号,标志和数字之间有空格。所以在我的代码中,当我检查值是数字时,它的结果是 true 但是当我尝试将它转换为float时它有一个错误......

SELECT ISNUMERIC('- 49.5')

结果:1​​

SELECT CONVERT(FLOAT, '- 49.5') 
  

将数据类型varchar转换为float时出错。

4 个答案:

答案 0 :(得分:4)

来自BOL

  

对于某些不是数字的字符,ISNUMERIC返回1,例如   加号(+),减号( - )和有效货币符号,如美元   sign($)。有关货币符号的完整列表,请参阅货币和   smallmoney(Transact-SQL)。

最好使用TRY_CAST/CONVERT/PARSE(SQL Server 2012 +):

SELECT TRY_CAST('- 49.5' AS FLOAT);

如果您的号码代表价格/尺寸/ ...我强烈建议您使用DECIMAL/NUMERIC而不是FLOAT

修改

  

我无法使用TRY_CAST。因为ISNUMERIC改变了我的代码流。

是的,你可以:

IF TRY_CAST(@val AS FLOAT) IS NULL
     -- @val is not a number
ELSE
     -- @val is number

答案 1 :(得分:2)

不,这不是错误。

https://docs.microsoft.com/en-us/sql/t-sql/functions/isnumeric-transact-sql中所述,当输入表达式可以转换为以下任何数据类型时,ISNUMERIC函数返回1:intnumeric,{{ 1}},bigintmoneysmallintsmallmoneytinyintfloatdecimal

虽然值“ - 49.5”无法转换为realintnumeric,但可以将其转换为float

money

返回SELECT CONVERT(MONEY,'- 49.5')

答案 2 :(得分:1)

Sql的定义如下,并在msdn

中提到
  

对于某些不是数字的字符,例如加号(+),减号( - )和有效货币符号(如美元符号($)),ISNUMERIC返回1。

参考:msdn ISNUMERIC()

所以IsNumeric给你1,因为它遇到-和数字(不包括空格)。但convert失败,因为数字之间有空格。

IsNumeric可以有趣的行为。

以下也返回1

SELECT isnumeric('- .');

编辑:

你曾说过你不能使用ISNUMERIC之外的任何其他内容,但考虑ISNUMERIC未知行为(可能是sql server中的错误)

找到一个有趣的参考ISNumeric() StackExchange说下面的内容;​​

  

如果您使用的是SQL Server 2012+,请使用TRY_CONVERTTRY_CAST来检查字符串是否可以转换为某种给定类型。在它们提供足够功能的地方,它们优于TRY_PARSE,因为后者涉及通过CLR集成进行更昂贵的处理。

答案 3 :(得分:1)

看上去' - 49.5' 。 (减号和数字之间的空格)不是数字。 Oracle 也存在同样的问题:

select cast('- 49.5' as float) from dual

给出错误: [代码:1722,SQL状态:42000] ORA-01722:无效数字

这很好用:

select cast('-49.5' as float) from dual;

JavaScript 相同:

Number("-49.5")
-49.5
Number("- 49.5")
NaN

Java

System.out.println (Float.valueOf("- 49.5"))

抛出异常:java.lang.NumberFormatException:对于输入字符串:" - 49.5"

Python

相同
Python 2.7.10 (default, Jul 15 2017, 17:16:57)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> float("-49.5")
-49.5
>>> float("- 49.5")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: - 49.5
>>>

与Mac(Xcode)上的 C 相同

printf("%f", atof("- 49.5"));

打印:0.000000