自定义计算表达式的函数
来源:互联网 发布:淘宝店天天特价 编辑:程序博客网 时间:2024/06/10 17:20
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
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
- 自定义计算表达式的函数
- 自定义EL表达式的函数
- 一个递归计算数学表达式的函数
- 一个计算剩余时间的php自定义函数
- 返回比较表达式比较结果/计算表达式值的函数
- 自定义函数的表达式求值类
- EL表达式-自定义函数
- EL表达式-自定义函数
- EL表达式-自定义函数
- EL表达式-自定义函数
- 自定义el表达式函数
- EL表达式-自定义函数
- 二叉树计算包含函数的中缀表达式
- 中缀算术转后缀算术表达式并计算的函数
- VB字符串表达式计算函数.
- 计算指定年月的最后一天的自定义函数
- 求一个能计算加减乘除的 mysql自定义函数
- 自定义绘制view、绘图过程中用到的函数计算
- PHP出现mktime()date()时间timezone警告的解决方法,尤其是phpExcelReader会出现这个警告
- 实战Linux Bluetooth编程(三) HCI层编程
- 关于jdbc 源码解析 DriverManager 和 ServiceLoader
- [GitHub][2014-05-14 22:00:17]65ca
- go语言:flag的使用
- 自定义计算表达式的函数
- 第七讲 常用的Web服务器控件(一)
- c++学习笔记之初窥c++
- Java的内存回收
- shell注意点(一)
- 读《格蠹汇编》第一章并实验
- 打印所有不超过n(n<256)的其平方具有对称性的数(也称回文数)
- 在夕阳再晨的日子里(一)----部员的成长
- 二叉树的先序、中序、后序以及层次遍历