日期:2014-05-17  浏览次数:20520 次

isnumeric之“D”字符,环境05
select isnumeric('21'), isnumeric('2D1'), isnumeric('2d'), isnumeric('d1'), isnumeric('d')
结果会等于多少呢?
1 1 0 0 0

似乎isnumeric自动把d字符当做是数字对应的后面多少位0来对待,所以'2D1'是数字字符串,
所以类似的判定就得先replace一下'd'字符串才行。
不知道我说的对不对,还请各位路过的瞧瞧。
------最佳解决方案--------------------
联机丛书上写的该函数式为了,  确定一个表达式是否是一个有效的数字类型

数字类型是很关键的一个词,而且容易引起歧义。

lz试试看下面的代码
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


居然都是1 。

LZ 使用的是字母d , 试试看 e 也是同样的效果,因为在这里d和e代表的不是字符,而是数字符号。
同样,这个函数也就认定为一个数字类型。



------其他解决方案--------------------
引用:
select isnumeric('21'), isnumeric('2D1'), isnumeric('2d'), isnumeric('d1'), isnumeric('d')
结果会等于多少呢?
1 1 0 0 0

似乎isnumeric自动把d字符当做是数字对应的后面多少位0来对待,所以'2D1'是数字字符串,
所以类似的判定就得先replace一下'……


这个不是一个错误,只是有趣的一个误解。如果LZ需要筛选数字,就需要使用NOT LIKE '%[^0-9]%'来确定了,
虽然这样的效率会比较低一些。

------其他解决方案--------------------
还有这种说法啊?
------其他解决方案--------------------
嗯,你说的对。
------其他解决方案--------------------
学习了,这个以前还真没注意过
------其他解决方案--------------------
这种用法真的很难发现。佩服楼主!
------其他解决方案--------------------
ISNUMERIC(具体的数值) 函数判断所给定的表达式是否为合理的数值  
如果是合理的数值 返回1 否则返回 0