SQL判断是否为数值类型

sql2005版本有个函数ISNUMERIC(expression)函数:当expression为数字时,返回1,否则返回0。

select ISNUMERIC('123') --结果为1

但是,该函数有个缺点!

 1 SELECT 
 2  ,ISNUMERIC('-') as '-'    --1
 3  ,ISNUMERIC('+') as '+'    --1
 4  ,ISNUMERIC('$') as '$'    --1
 5  ,ISNUMERIC('.') as '.'    --1
 6  ,ISNUMERIC(',') as ','    --1
 7  ,ISNUMERIC('') as ''    --1
 8  ,ISNUMERIC('2D3') AS '2D3'--1
 9 ,ISNUMERIC('1d1') AS '1d1'--1
10 ,ISNUMERIC('1e1') AS '1e1'--1
11 ,ISNUMERIC('d') AS 'd'   --0
 
 
当含有美元符、加减号、逗号等符号时,或者D、E的前后均出现数字时,也会返回1,这就比较头疼了。标点符号倒是好理解,为什么d,e这种情况
不要问我为什么,因为微软的厂长是我表哥。
 

另外一个函数

PATINDEX

适用场景:2005及以上(2005之前的版本没试过,应该也支持)

 
SELECT PATINDEX('%[^0-9|.|-|+]%','2.2')--返回0  【带小数点与正负极】

但又有一个漏洞
SELECT PATINDEX('%[^0-9|.|-|+]%','2.2.2')  --返回0 
苍天啊大地啊,以不能偷懒了。结合二个函数写一个数字验证函数算了。
 1 -- =============================================
 2 -- Author:        <LYZ>
 3 -- Create date: <2019-11-07>
 4 -- Description:    <判断是否为数值类型>
 5 -- =============================================
 6 Create function [dbo].[fn_GetIsNumeric](@Str nvarchar(50))
 7   Returns bit
 8 As
 9 begin
10   Declare @IsNum int,@ResultNum bit
11   set  @ResultNum=0
12   set  @IsNum=0
13     --首先看是否为数值类型
14   set @IsNum=(SELECT ISNUMERIC(@Str))  --为1时为数值类,为0时非法类
15 
16   if @IsNum=1
17     begin
18      set @IsNum=(SELECT PATINDEX('%[^0-9|.]%',@Str)) --为1时非法数字,为0时为数量
19      if  @IsNum=0
20        set @IsNum=2
21      else 
22        set @IsNum=0
23     end
24 
25   
26   if @IsNum>0
27     set  @ResultNum=1
28  return  @ResultNum
29 end 
30 GO