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

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

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

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

具体SQL如下:

ALTER FUNCTION [dbo].[getNumByExpressions]( @Number nvarchar(500))
RETURNS numeric(10,4)
--返回-1,表示字符串存在问题
--else返回其计算结果
AS
begin
declare @retrunNum numeric(10,4)
declare @NumberStar nvarchar(500)
declare @a numeric(10,4)
declare @b numeric(10,4)

declare @a1 nvarchar(500)
declare @b1 nvarchar(500)

declare @Numberillegal nvarchar(500)
declare @Numberdouble nvarchar(500)

set @retrunNum=0
--判断非法字符
if PATINDEX('%[^0123456789+*.]%', @Number)>0
begin
return -1
end
--判断2个运算符相连接
else if CHARINDEX('..',@Number)>0 or CHARINDEX('**',@Number)>0 or CHARINDEX('++',@Number)>0 or
CHARINDEX('*.',@Number)>0 or CHARINDEX('.*',@Number)>0 or CHARINDEX('+.',@Number)>0 or
CHARINDEX('.+',@Number)>0 or CHARINDEX('*+',@Number)>0 or CHARINDEX('+*',@Number)>0 or rtrim(ltrim(@Number))=''
begin
return -1
end
--判断运算是否在开头和结尾
else if left(@Number,1)='.' or left(@Number,1)='*' or left(@Number,1)='+' or
right(@Number,1)='.' or right(@Number,1)='*' or right(@Number,1)='+'
begin
return -1
end
else
begin
--数字全角判断
set @Numberdouble=@Number
while isnull(len(@Numberdouble),0)>0
begin
if ascii(left(@Numberdouble,1))=163
begin
return -1
end
if len(@Numberdouble)>1
begin
set @Numberdouble = right(@Numberdouble,len(@Numberdouble)-1)
end
else
begin
set @Numberdouble=null
end

end
--计算结果
while CHARINDEX('+',@Number)>0
begin
set @NumberStar = SUBSTRING(@Number,0,CHARINDEX('+',@Number))
set @Number=SUBSTRING(@Number,CHARINDEX('+',@Number)+1,len(@Number)-CHARINDEX('+',@Number))
if CHARINDEX('*',@NumberStar)>0
begin
--判断a,b是否合法:844.5.5*1
set @a1=SUBSTRING(@NumberStar,0,CHARINDEX('*',@NumberStar))
set @b1=SUBSTRING(@NumberStar,CHARINDEX('*',@NumberStar)+1,len(@NumberStar)-CHARINDEX('*',@NumberStar))

if CHARINDEX('.',@a1)>0
begin
set @a1=SUBSTRING(@a1,CHARINDEX('.',@a1)+1,len(@a1)-CHARINDEX('.',@a1))
if CHARINDEX('.',@a1)>0
begin
return -1
end
end
if CHARINDEX('.',@b1)>0
begin
set @b1=SUBSTRING(@b1,CHARINDEX('.',@b1)+1,len(@b1)-CHARINDEX('.',@b1))
if CHARINDEX('.',@b1)>0
begin
return -1
end
end
set @a=SUBSTRING(@NumberStar,0,CHARINDEX('*',@NumberStar))
set @b=SUBSTRING(@NumberStar,CHARINDEX('*',@NumberStar)+1,len(@NumberStar)-CHARINDEX('*',@NumberStar))
set @retrunNum=@retrunNum+@a*@b
end
else
begin
--判断a,b是否合法:844.5.5*1
set @a1=@NumberStar
if CHARINDEX('.',@a1)>0
begin
set @a1=SUBSTRING(@a1,CHARINDEX('.',@a1)+1,len(@a1)-CHARINDEX('.',@a1))
if CHARINDEX('.',@a1)>0
begin
return -1
end
end
set @retrunNum=@retrunNum+@NumberStar
end
end
if CHARINDEX('*',@Number)>0
begin
set @a1=SUBSTRING(@Number,0,CHARINDEX('*',@Number))
set @b1=SUBSTRING(@Number,CHARINDEX('*',@Number)+1,len(@Number)-CHARINDEX('*',@Number))
--判断a,b是否合法:844.5.5*1
if CHARINDEX('.',@a1)>0
begin
set @a1=SUBSTRING(@a1,CHARINDEX('.',@a1)+1,len(@a1)-CHARINDEX('.',@a1))
if CHARINDEX('.',@a1)>0
begin
return -1
end
end
if CHARINDEX('.',@b1)>0
begin
set @b1=SUBSTRING(@b1,CHARINDEX('.',@b1)+1,len(@b1)-CHARINDEX('.',@b1))
if CHARINDEX('.',@b1)>0
begin
return -1
end
end
set @a=SUBSTRING(@Number,0,CHARINDEX('*',@Number))
set @b=SUBSTRING(@Number,CHARINDEX('*',@Number)+1,len(@Number)-CHARINDEX('*',@Number))
set @retrunNum=@retrunNum+@a*@b
end
else
begin
--判断a,b是否合法:844.5.5*1
set @a1=@Number
if CHARINDEX('.',@a1)>0
begin
set @a1=SUBSTRING(@a1,CHARINDEX('.',@a1)+1,len(@a1)-CHARINDEX('.',@a1))
if CHARINDEX('.',@a1)>0
begin
return -1
end
end
set @retrunNum=@retrunNum+@Number
end
end
return @retrunNum
end

SQL Server中计算表达式的和的更多相关文章

  1. SQL Server 中计算农历

    1.建一表,放初始化资料   因为农历的日期,是由天文学家推算出来的,到现在只有到2049年的,以后的有了还可以加入!   CREATE TABLE SolarData ( yearId int no ...

  2. 使用CASE表达式替代SQL Server中的动态SQL

    原文:使用CASE表达式替代SQL Server中的动态SQL 翻译自: http://www.mssqltips.com/sqlservertip/1455/using-the-case-expre ...

  3. 此操作只能由 SQL Server 中拥有配置数据库读取权限的用户在已加入到某个服务器场的计算机上执行

    错误提示:此操作只能由 SQL Server 中拥有配置数据库读取权限的用户在已加入到某个服务器场的计算机上执行.若要将此服务器连接到服务器场,请使用 SharePoint 产品配置向导,该向导可从 ...

  4. sql server中的临时表、表变量和公用表表达式

    在编写T-SQL语句的时候,SQL Server提供了三种方法临时存储某些结果集,分别是临时表.表变量和公用表表达式. 临时表 临时表需要在临时数据库TempDB中通过I/O操作来创建表结构,一旦用户 ...

  5. SQL SERVER中用户定义标量函数(scalar user defined function)的性能问题

    用户定义函数(UDF)分类  SQL SERVER中的用户定义函数(User Defined Functions 简称UDF)分为标量函数(Scalar-Valued Function)和表值函数(T ...

  6. Sql Server中不常用的表运算符之APPLY(2)

    在Sql Server中不常用的表运算符之APPLY(1)中提到,SQL2005中新支持的APPLY的特性:1.可以直接将表表达式(表值函数或者子查询)作为APPLY语句的右表连接左表.2.由于使用A ...

  7. SQL Server中的RAND函数的介绍和区间随机数值函数的实现

        工作中会遇到SQL Server模拟数据生成以及数值列值(如整型.日期和时间数据类型)随机填充等等任务,这些任务中都要使用到随机数.鉴于此,本文将对SQL Server中随机数的使用简单做个总 ...

  8. SQL Server中的SQL语句优化与效率问题

    很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解.比如: select * from table1 where name='zhan ...

  9. SQL SERVER中的流程控制语句

    流程控制语句 是指用来控制程序运行和流程分至点额命令.一般指的是逻辑计算部分的控制. 1.Begin End语句 封装了多个T-SQL语句组合,将他们组成一个单元来处理. 一般在条件查询或者循环等控制 ...

随机推荐

  1. 关于python使用cv画矩形并填充颜色同时填充文字

    font = cv2.FONT_HERSHEY_SIMPLEX # 使用默认字体 cv2.rectangle(im, (10, 10), (110, 110), (0, 0, 255), thickn ...

  2. CodeChef June Challenge 2017

    好气啊,本来以为比赛时间还有很多,结果回家养病两天回到学校怎么比赛就结束了(雾),大约是小高考弄错了时间? 挑3道有意思的写写题解吧. Cloning 题目大意:给一个序列,每次询问两个等长区间,问区 ...

  3. bzoj 3874: [Ahoi2014]宅男计划

    Description  [故事背景] 自从迷上了拼图,JYY就变成了个彻底的宅男.为了解决温饱问题,JYY 不得不依靠叫外卖来维持生计. [问题描述] 外卖店一共有N种食物,分别有1到N编号.第i种 ...

  4. hihoCoder 1051 补提交卡(贪心,枚举)

    #1051 : 补提交卡 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho给自己定了一个宏伟的目标:连续100天每天坚持在hihoCoder上提交一个程序.100天过 ...

  5. Vijos P1113 不高兴的津津【模拟】

    不高兴的津津 描述 津津上初中了.妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班.另外每周妈妈还会送她去学习朗诵.舞蹈和钢琴.但是津津如果一天上课超过八个小时就会 ...

  6. dp水一天

    水一些dp的联系题 标签: dp ###hdu_2045 题意 一穿珠子,用三种颜色染色,要求相邻的珠子和两端的珠子不能是同一种颜色,求当有n个珠子的时候有几种染色方案 题解 表示dp[i][j][k ...

  7. A. Two Bases

    A. Two Bases time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  8. cesium编程入门(六)添加 3D Tiles,并调整位置,贴地

    添加 3D Tiles,并调整位置 3D Tiles 是什么 3DTiles数据集是cesium小组AnalyticlGraphics与2016年3月定义的一种数据集,3DTiles数据集以分块.分级 ...

  9. zookeeper部署和运行

    环境准备: 操作系统,此处使用windows系统 Java运行环境,JDK1.6以上 下载对应操作系统zookeeper安装包zookeeper-x.x.x.tar.gz,下载地址:http://zo ...

  10. mysql 批量更新与批量更新多条记录的不同值实现方法

    作者: 字体:[增加 减小] 类型:转载 时间:2013-10-02 我要评论 在mysql中批量更新我们可能使用update,replace into来操作,下面小编来给各位同学详细介绍mysql ...