SQL Server的ISNUMERIC函数,只有一个减号

时间:2016-11-09 13:48:35

标签: sql-server

我不确定这是对其他SQL Server用户的问题还是警告。

我们使用SQL Server的ISNUMERIC函数来确定字符串是否为数字。但是今天,我们遇到了一个问题,即用户只输了一个减号作为字符串。

SQL Server的ISNUMERIC为此字符串返回1,表明它是一个数字。 可以 CAST将此字符串转换为int(它转换为值0),但在将其转换为数字时失败。

DECLARE @str NVARCHAR(200)

SET @str = '-'

--  This returns 1  (i.e. this string IS a number)
SELECT ISNUMERIC(@str)

--  This works (and returns 0)
SELECT CAST(@str as int)                

--  This throws an error of "Arithmetic overflow error converting nvarchar to data type numeric."
SELECT CAST(@str as numeric(12, 0))     

--  This throws an error of "Arithmetic overflow error converting nvarchar to data type numeric."
SELECT CAST(@str as numeric(12, 7))

还有其他可能发生这种情况的奇怪案例吗?

2 个答案:

答案 0 :(得分:2)

您可以进行简单的检查:

;WITH cte AS (
SELECT 1 as num
UNION ALL
SELECT num+1
FROM cte
WHERE num< 256
)

SELECT  num,
        CHAR(num),
        ISNUMERIC(CHAR(num))
FROM cte
WHERE ISNUMERIC(CHAR(num)) = 1 
OPTION (MAXRECURSION 1000)

这表明不仅数字被认为是有效的数字类型:

$
+
,
-
.
\
€
¤

其中一个解决方法是使用NOT LIKE '%[^0-9]%'

F.e。如果我将此nd CHAR(num) NOT LIKE '%[^0-9]%'添加到下面查询的WHERE语句中,它将返回0到9之间的数字

或使用TRY_PARSE(.. as int)

一些链接:

答案 1 :(得分:0)

这里有一个可能的替换用户函数 - 只接受整数 - 由于最大整数大小限制(当然因BIGINT而异),它无法保证转换 - 它接受-1但拒绝 - 。

curl