自定义计算表达式的函数

CREATE FUNCTION dbo.GetExp(@pstrExpress AS VARCHAR(8000)) 
RETURNS DECIMAL(18,6) AS
BEGIN
DECLARE @i INT,@j INT
DECLARE @c1 CHAR(1),@c2 CHAR(1),@c VARCHAR(100)
DECLARE @v1 DECIMAL(18,6),@v2 DECIMAL(18,6),@v DECIMAL(18,6)
DECLARE @t TABLE(ID INT IDENTITY(1,1),s VARCHAR(100))
DECLARE @s TABLE(ID INT IDENTITY(1,1),s VARCHAR(100))
DECLARE @sv TABLE(ID INT IDENTITY(1,1),v DECIMAL(18,6))


SET @pstrExpress=REPLACE(@pstrExpress,'','')
SELECT @i=0,@j=LEN(@pstrExpress),@c2='',@c=''
WHILE @i<@j
BEGIN
SELECT @c1=@c2,@i=@i+1
SELECT @c2=SUBSTRING(@pstrExpress,@i,1)
IF CHARINDEX(@c2,'.0123456789') >0 or (@c2='-'and @c1 IN('','*','-','+','/','('))
BEGIN SELECT @c=@c+@c2 CONTINUE END
IF @c<>'' BEGIN INSERT @t(s) SELECT @c SELECT @c='' END
IF CHARINDEX(@c2,')')>0
BEGIN
INSERT @t(s) SELECT s FROM @s WHERE ID >ISNULL((SELECT MAX(ID) FROM @s WHERE s IN('(')),0) ORDER BY ID DESC
DELETE @s WHERE ID >=ISNULL((SELECT MAX(ID) FROM @s WHERE s IN('(')),0) 
CONTINUE
END
IF CHARINDEX(@c2,'+-)')>0
BEGIN
INSERT @t(s) SELECT s FROM @s WHERE ID >ISNULL((SELECT MAX(ID) FROM @s WHERE s IN('(')),0) ORDER BY ID DESC
DELETE @s WHERE ID >ISNULL((SELECT MAX(ID) FROM @s WHERE s IN('(')),0) 
IF @c2<>')' INSERT @s(s) SELECT @c2
CONTINUE
END
IF CHARINDEX(@c2,'*/')>0
BEGIN
INSERT @t(s) SELECT s FROM @s WHERE ID >ISNULL((SELECT MAX(ID) FROM @s WHERE s IN('(','+','-')),0) ORDER BY ID DESC
DELETE @s WHERE ID >ISNULL((SELECT MAX(ID) FROM @s WHERE s IN('(','+','-')),0) 
INSERT @s SELECT @c2
CONTINUE
END
IF CHARINDEX(@c2,'(')>0 INSERT @s SELECT @c2
END
IF @c<>'' INSERT @t(s) SELECT @c
INSERT @t(s) SELECT s FROM @s ORDER BY ID DESC
SELECT @i=0,@j=MAX(ID) FROM @t
WHILE @i<@j
BEGIN
SELECT @i=@i+1
SELECT @c=s FROM @t WHERE ID =@i
IF @c='(' CONTINUE
IF @c NOT IN('*','-','+','/') BEGIN INSERT @sv(v) SELECT CONVERT(float,@c) CONTINUE END
SELECT @v2=v FROM @sv DELETE @sv WHERE ID =(SELECT MAX(ID) FROM @sv)
SELECT @v1=v FROM @sv DELETE @sv WHERE ID =(SELECT MAX(ID) FROM @sv)
SELECT @v=CASE @c WHEN '+' THEN @v1 + @v2 WHEN '-' THEN @v1 - @v2
WHEN '*' THEN @v1*@v2 WHEN '/' THEN @v1/@v2 END
INSERT @sv(v) SELECT @v
END
SELECT @v=v FROM @sv
RETURN @v

END


----

调用时:Select dbo.GetExp('3*(1+7))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值