我不确定这是对其他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))
还有其他可能发生这种情况的奇怪案例吗?
答案 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