SQL Server ISNUMERIC返回错误的数据

Hir*_*nki 3 sql t-sql sql-server

我正在使用SQL Server 2008 R2.当我执行以下查询时,当条形码内部显示"D"时,ISNUMERIC正在评估为true(1).

 SELECT ISNUMERIC('7210300106D30')
Run Code Online (Sandbox Code Playgroud)

如果我用除D或E之外的其他字母执行相同的代码,它似乎评估为false(0)这是我所期望的.

 SELECT ISNUMERIC('7210300106K30')
Run Code Online (Sandbox Code Playgroud)

任何人都可以了解为什么会发生这种情况?谢谢.

Tsc*_*cka 6

编辑

我的初步答案是错误的,因为e在科学记数法中使用指定指数,而D也用于表示数字格式.

喜欢 10e3

请注意,"e"和"d"(每个人忘记这一点)都不包含在结果中作为数字,因为单个"e"或"d不被认为是数字.但是,这些字母代表两种不同形式的数字符号(带有"e"的符号)是科学记数法.所以,如果你有任何看起来如下的东西,ISNUMERIC会将它们识别为"数字"......

SELECT ISNUMERIC('0d2345')SELECT ISNUMERIC('12e34')

http://www.sqlservercentral.com/articles/ISNUMERIC()/71512/

它可能会将其视为十六进制数,这是数字序列中的任何内容:

0123456789ABCDEF
Run Code Online (Sandbox Code Playgroud)

十六进制描述了base-16数字系统.也就是说,它在为下一个数字添加新位置之前描述了包含16个连续数字作为基本单位(包括0)的编号系统.(注意,我们在这里使用"16"作为十进制数来解释十六进制数为"10"的数字.)十六进制数字是0-9然后使用字母AF.
http://whatis.techtarget.com/definition/hexadecimal


Gor*_*off 5

如果您正在寻找数字串,请不要使用isnumeric().只需使用like:

select (case when col like '%[^0-9]%' then 0 else 1 end) as IsAllDigits
Run Code Online (Sandbox Code Playgroud)

如果您想尝试转换,请使用try_convert():

select (case when try_convert(bigint, col) is null then 0 else 1 end) as IsConvertable
Run Code Online (Sandbox Code Playgroud)