zoukankan      html  css  js  c++  java
  • SQL Server中计算表达式的和

    项目使用的是SQL Server数据库,需要做一个审核规则,字段A中表达式的值和字段B中的值,做比较:

    需求本身很简单,但是表达式中存在很多非法字符(非法全角,运算符,汉字……)

    eg:1.1.1*2;1*+2,……

    因此需要判断,否则直接运算,会报异常

    具体SQL如下:

      1 ALTER FUNCTION [dbo].[getNumByExpressions]( @Number nvarchar(500))
      2 RETURNS numeric(10,4) 
      3 --返回-1,表示字符串存在问题
      4 --else返回其计算结果
      5 AS
      6 begin
      7 declare @retrunNum numeric(10,4)
      8 declare @NumberStar nvarchar(500)
      9 declare @a numeric(10,4)
     10 declare @b numeric(10,4)
     11 
     12 declare @a1 nvarchar(500)
     13 declare @b1 nvarchar(500)
     14 
     15 declare @Numberillegal nvarchar(500)
     16 declare @Numberdouble nvarchar(500)
     17 
     18 set @retrunNum=0
     19 --判断非法字符
     20 if PATINDEX('%[^0123456789+*.]%', @Number)>0
     21 begin
     22 return -1
     23 end
     24 --判断2个运算符相连接
     25 else if CHARINDEX('..',@Number)>0 or CHARINDEX('**',@Number)>0 or CHARINDEX('++',@Number)>0 or 
     26 CHARINDEX('*.',@Number)>0 or CHARINDEX('.*',@Number)>0 or CHARINDEX('+.',@Number)>0 or 
     27 CHARINDEX('.+',@Number)>0 or CHARINDEX('*+',@Number)>0 or CHARINDEX('+*',@Number)>0 or rtrim(ltrim(@Number))=''
     28 begin
     29 return -1
     30 end
     31 --判断运算是否在开头和结尾
     32 else if left(@Number,1)='.' or left(@Number,1)='*' or left(@Number,1)='+' or 
     33 right(@Number,1)='.' or right(@Number,1)='*' or right(@Number,1)='+' 
     34 begin
     35 return -1
     36 end
     37 else
     38 begin
     39 --数字全角判断
     40 set @Numberdouble=@Number
     41 while isnull(len(@Numberdouble),0)>0
     42 begin
     43 if ascii(left(@Numberdouble,1))=163
     44 begin
     45 return -1
     46 end
     47 if len(@Numberdouble)>1
     48 begin
     49 set @Numberdouble = right(@Numberdouble,len(@Numberdouble)-1)
     50 end
     51 else
     52 begin
     53 set @Numberdouble=null
     54 end
     55 
     56 end
     57 --计算结果
     58 while CHARINDEX('+',@Number)>0
     59 begin
     60 set @NumberStar = SUBSTRING(@Number,0,CHARINDEX('+',@Number))
     61 set @Number=SUBSTRING(@Number,CHARINDEX('+',@Number)+1,len(@Number)-CHARINDEX('+',@Number))
     62 if CHARINDEX('*',@NumberStar)>0
     63 begin
     64 --判断a,b是否合法:844.5.5*1
     65 set @a1=SUBSTRING(@NumberStar,0,CHARINDEX('*',@NumberStar))
     66 set @b1=SUBSTRING(@NumberStar,CHARINDEX('*',@NumberStar)+1,len(@NumberStar)-CHARINDEX('*',@NumberStar))
     67 
     68 if CHARINDEX('.',@a1)>0
     69 begin
     70 set @a1=SUBSTRING(@a1,CHARINDEX('.',@a1)+1,len(@a1)-CHARINDEX('.',@a1))
     71 if CHARINDEX('.',@a1)>0
     72 begin
     73 return -1
     74 end
     75 end
     76 if CHARINDEX('.',@b1)>0
     77 begin
     78 set @b1=SUBSTRING(@b1,CHARINDEX('.',@b1)+1,len(@b1)-CHARINDEX('.',@b1))
     79 if CHARINDEX('.',@b1)>0
     80 begin
     81 return -1
     82 end
     83 end
     84 set @a=SUBSTRING(@NumberStar,0,CHARINDEX('*',@NumberStar))
     85 set @b=SUBSTRING(@NumberStar,CHARINDEX('*',@NumberStar)+1,len(@NumberStar)-CHARINDEX('*',@NumberStar))
     86 set @retrunNum=@retrunNum+@a*@b
     87 end
     88 else 
     89 begin
     90 --判断a,b是否合法:844.5.5*1
     91 set @a1=@NumberStar
     92 if CHARINDEX('.',@a1)>0
     93 begin
     94 set @a1=SUBSTRING(@a1,CHARINDEX('.',@a1)+1,len(@a1)-CHARINDEX('.',@a1))
     95 if CHARINDEX('.',@a1)>0
     96 begin
     97 return -1
     98 end
     99 end
    100 set @retrunNum=@retrunNum+@NumberStar
    101 end
    102 end
    103 if CHARINDEX('*',@Number)>0
    104 begin
    105 set @a1=SUBSTRING(@Number,0,CHARINDEX('*',@Number))
    106 set @b1=SUBSTRING(@Number,CHARINDEX('*',@Number)+1,len(@Number)-CHARINDEX('*',@Number))
    107 --判断a,b是否合法:844.5.5*1
    108 if CHARINDEX('.',@a1)>0
    109 begin
    110 set @a1=SUBSTRING(@a1,CHARINDEX('.',@a1)+1,len(@a1)-CHARINDEX('.',@a1))
    111 if CHARINDEX('.',@a1)>0
    112 begin
    113 return -1
    114 end
    115 end
    116 if CHARINDEX('.',@b1)>0
    117 begin
    118 set @b1=SUBSTRING(@b1,CHARINDEX('.',@b1)+1,len(@b1)-CHARINDEX('.',@b1))
    119 if CHARINDEX('.',@b1)>0
    120 begin
    121 return -1
    122 end
    123 end
    124 set @a=SUBSTRING(@Number,0,CHARINDEX('*',@Number))
    125 set @b=SUBSTRING(@Number,CHARINDEX('*',@Number)+1,len(@Number)-CHARINDEX('*',@Number))
    126 set @retrunNum=@retrunNum+@a*@b
    127 end
    128 else
    129 begin
    130 --判断a,b是否合法:844.5.5*1
    131 set @a1=@Number
    132 if CHARINDEX('.',@a1)>0
    133 begin
    134 set @a1=SUBSTRING(@a1,CHARINDEX('.',@a1)+1,len(@a1)-CHARINDEX('.',@a1))
    135 if CHARINDEX('.',@a1)>0
    136 begin
    137 return -1
    138 end
    139 end
    140 set @retrunNum=@retrunNum+@Number
    141 end
    142 end
    143 return @retrunNum
    144 end
  • 相关阅读:
    禁止360开机自动启动
    Google Code注册方法详解 Google Code网盘申请方法
    做程序开发工作,编程思想很重要
    EPP(Eclipse PHP)语法高亮仿EditPlus配置
    2HC32F460(华大)+BC260Y(NBIOT)基本控制篇(自建物联网平台)整体运行测试微信小程序扫码绑定BC260Y(NBIOT),并通过MQTT和单片机实现远程通信控制
    2HC32F460(华大)+BC260Y(NBIOT)基本控制篇(自建物联网平台)整体运行测试Android扫码绑定BC260Y(NBIOT),并通过MQTT和单片机实现远程通信控制
    【面向对象】宽接口、窄接口和访问方法(上)
    重构,小步进行曲
    Java中有些好的特性(一):静态导入
    【读书笔记】设计模式沉思录
  • 原文地址:https://www.cnblogs.com/dz-boss/p/8029124.html
Copyright © 2011-2022 走看看