知道为什么ISNUMERIC('0D0') = 1
在SQL Server 2008中为TRUE?
我正在验证来自另一个系统的ID号,它有时包含我们不想带来的字母,但这种组合使代码跳闸(它认为是数字的特定ID是“005406257D6”)。下游我们正在做CONVERT(BIGINT, @val)
,当它找到这些“D”值时显然会窒息。
我打的是什么特例,我该怎么说呢?
答案 0 :(得分:11)
基本上,IsNumeric是无用的 - 它验证的是字符串可以转换为任何的数字类型。在这种情况下,“0D0”可以转换为浮点数。 (我不记得原因,但实际上“D”是“E”的同义词,并且意味着它是科学记数法):
select CONVERT(float,'2D3')
2000
如果你想验证它只是数字,那么not @val like '%[^0-9]%'
将是一个更好的测试。您还可以通过添加长度检查来进一步改进。
答案 1 :(得分:0)
对原因的一个很好的解释。
http://www.sqlservercentral.com/articles/IsNumeric/71512/
(下面是@ RedFilter更详尽的查询/列表)
SELECT [Ascii Code] = STR(Number)
,[Ascii Character] = CHAR(Number)
,[ISNUMERIC Returns] = ISNUMERIC(CHAR(Number))
FROM Master.dbo.spt_Values
WHERE Type = 'P'
AND Number BETWEEN 0 AND 255
AND ISNUMERIC(CHAR(Number)) = 1
UNION
SELECT [Ascii Code] = STR(Number)
,[Ascii Character] = CHAR(Number)
,[ISNUMERIC Returns] = ISNUMERIC('0' + CHAR(Number) + '0')
FROM Master.dbo.spt_Values
WHERE Type = 'P'
AND Number BETWEEN 0 AND 255
AND ISNUMERIC('0' + CHAR(Number) + '0') = 1
yeilds
Ascii Code Ascii Character
---------- ---------------
0
9
10
11
12
13
36 $
43 +
44 ,
45 -
46 .
48 0
49 1
50 2
51 3
52 4
53 5
54 6
55 7
56 8
57 9
68 D
69 E
92 \
100 d
101 e
128 €
160
162 ¢
163 £
164 ¤
165 ¥