下面为您介绍一个SQL中返回计算表达式的函数,该函数可以计算加、减、乘、除,但是不能算幂,供您参考,希望对您学习SQL中的函数能有有所帮助。
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