在t-sql中使用IsNumeric的问题?

时间:2017-10-10 19:41:42

标签: sql-server

下面是一些测试SQL。 IsNumeric表示05031,的子字符串是数字,但由于,而尝试将其转换为实际数字时失败。这是SQL中的错误吗?

DECLARE @Str NVARCHAR(20)

SET @Str = 'XYZ 505031, some text'

SELECT CASE WHEN ISNUMERIC(SUBSTRING(@Str,6,7)) = 1 THEN CONVERT(int,SUBSTRING(@Str,6,7))  ELSE 0 END, SUBSTRING(@Str,6,7)

3 个答案:

答案 0 :(得分:2)

你应该使用try_cast,因为login.html的ISNUMERIC评估为1

  

对于某些非数字字符,例如加号(+),减号( - )和有效货币符号(如美元符号($)),ISNUMERIC返回1。有关货币符号的完整列表,请参阅money和s​​mallmoney(Transact-SQL)。       DECLARE @Str NVARCHAR(20)

5031,

答案 1 :(得分:0)

如果是2012+,您可以使用Try_Convert()。我们使用MONEY因为这将转换前导零,然后我们转换为int

示例

DECLARE @Str NVARCHAR(20)

SET @Str = 'XYZ 505031, some text'

SELECT AsInt = IsNull(try_convert(int,try_convert(money,SUBSTRING(@Str,6,7))),0)
     , AsStr = SUBSTRING(@Str,6,7)

<强>返回

AsInt   AsStr
5031    05031, 

答案 2 :(得分:0)

这是因为您的substring最后也在逗号。

SELECT SUBSTRING(@Str, 6, 7);

结果:

05031, 

然而,

SELECT SUBSTRING(@Str, 6, 5);

结果:

05031

并且

SELECT CASE WHEN ISNUMERIC(SUBSTRING(@Str,6,5)) = 1 THEN CONVERT(int,SUBSTRING(@Str,6,5))  ELSE 0 END, SUBSTRING(@Str,6,5) 

结果:

5031 | 05031