Due to the bizarre limitation of Microsoft that you can't use EXEC or SP_EXECUTESQL in a stored function. I have had to resort to the following type of code which, even yet, isn't completely finished. Maybe you could find something useful within.
DROP FUNCTION [dbo].[mthstrv08_rtrn_var70]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[mthstrv08_rtrn_var70](@strn varchar(60))
RETURNS varchar(80)
AS
BEGIN
declare @ret2 varchar(80)
declare @jp1 varchar(1)
set @jp1 = substring(@strn ,1,1)
DECLARE @opo1 varchar(1)
set @opo1='x'
DECLARE @opo2 varchar(1)
set @opo2='x'
DECLARE @opo3 varchar(1)
set @opo3='x'
DECLARE @opostrn varchar(3)
declare @num1 int -- numeric(30,20)
declare @num1char varchar(10)
declare @num1cwnt smallint
set @num1char = '|'
set @num1cwnt = -1
set @num1 = 0
declare @num2 int -- numeric(30,20)
declare @num2char varchar(10)
declare @num2cwnt smallint
set @num2char = '|'
set @num2cwnt = -1
declare @num3 int -- decimal(30,20)
declare @num3char varchar(10)
declare @num3cwnt smallint
set @num3char = '|'
set @num3cwnt = -1
declare @num4 int -- decimal(30,20)
declare @num4char varchar(10)
declare @num4cwnt smallint
set @num4char = '|'
set @num4cwnt = -1
declare @sum1 numeric(30,5)
declare @sum2 numeric(30,5)
declare @sum3 numeric(30,20)
declare @sum4 numeric(30,25)
declare @sum5 numeric(30,20)
declare @sum6 numeric(30,10)
declare @curval varchar(1)
declare @prevval varchar(1)
declare @mathstrn varchar(40)
declare @loopval smallint
declare @strlen smallint
declare @patern varchar(40)
declare @numflag smallint
set @numflag=0
set @loopval=3
set @patern='('
set @prevval='('
set @mathstrn =@strn
set @strlen = len(@mathstrn)
--
-- parse pattern of string
--
-- @loopval begins at 3 because we know first char is a indicator/flag
-- and 2nd char is always a '('
--
while @loopval <= @strlen
begin
set @curval = substring(@mathstrn,@loopval,1)
if @curval = '(' or @curval = ')'
begin
set @patern=@patern+@curval
end
if @curval in ( '/','+','-','*')
begin
set @patern=@patern+'o'
if @opo1='x'
begin
set @opo1 = @curval
end
else if @opo2='x'
begin
set @opo2 = @curval
end
else if @opo3='x'
begin
set @opo3 = @curval
end
end
if @curval between '0' and '9'
begin
set @patern=@patern+'n'
if @num1cwnt = -1
begin
set @numflag=1
set @num1cwnt=@loopval
end
else if @num2cwnt = -1 and (@prevval not between '0' and '9')
begin
set @numflag=2
set @num2cwnt=@loopval
end
else if @num3cwnt = -1 and (@prevval not between '0' and '9')
begin
set @numflag=3
set @num3cwnt=@loopval
end
else if @num4cwnt = -1 and (@prevval not between '0' and '9')
begin
set @numflag=4
set @num4cwnt=@loopval
end
if @numflag=1
begin
set @num1char=@num1char+@curval
end
else if @numflag=2
begin
set @num2char=@num2char+@curval
end
else if @numflag=3
begin
set @num3char=@num3char+@curval
end
else if @numflag=4
begin
set @num4char=@num4char+@curval
end
end
set @loopval=@loopval+1
set @prevval = @curval
end
set @patern = replace(@patern,'nnnnnnnnn','n')
set @patern = replace(@patern,'nnnnnnnn','n')
set @patern = replace(@patern,'nnnnnnn','n')
set @patern = replace(@patern,'nnnnnn','n')
set @patern = replace(@patern,'nnnnn','n')
set @patern = replace(@patern,'nnnn','n')
set @patern = replace(@patern,'nnn','n')
set @patern = replace(@patern,'nn','n')
set @num1 = convert (int,substring(@num1char,2,9))
set @num2 = convert (int,substring(@num2char,2,9))
set @num3 = convert (int,substring(@num3char,2,9))
set @num4 = convert (int,substring(@num4char,2,9))
set @opostrn=@opo1+@opo2+@opo3
--set @patern = '((non)o(non))'
if @patern = '(((non)on)on)'
begin
set @sum1 =0
set @sum1 = @num1
set @sum1 =
case
when @opo1 = '*' then @sum1*@num2
when @opo1 = '+' then @sum1+@num2
when @opo1 = '-' then @sum1-@num2
when @opo1 = '/' then @sum1*1.00000000000000000000/@num2
end
set @sum2 =
case
when @opo2 = '*' then @sum1*@num3
when @opo2 = '+' then @sum1+@num3
when @opo2 = '-' then @sum1-@num3
when @opo2 = '/' then @sum1*1.0000000000000000000/@num3
end
if @opo3 = '/' begin
set @sum5 = @sum2 % @num4
set @sum6 = (@sum2 - @sum5 )*1.00000000000000000000/@num4
set @sum4 = @sum5*1.00000000000000000000/@num4
set @ret2 =
right(' '+convert( varchar(14), cast(@sum6 as bigint) ) ,14) +
--cast (cast (@sum6 as int ) as varchar(15) ) +
substring( cast (@sum4 as varchar(43) ),2, 42)
end
else begin
set @sum1 =
case
when @opo3 = '+' then @sum2+@num4
when @opo3 = '*' then @sum2*@num4
when @opo3 = '-' then @sum2-@num4
end
set @ret2 = cast (@sum1 as bigint )
end
end
else if @patern = '((non)o(non))'
begin
set @sum1 =
case
when @opo1 = '*' then @num1*@num2
when @opo1 = '+' then @num1+@num2
when @opo1 = '-' then @num1-@num2
when @opo1 = '/' then @num1*1.0000000000000000000/@num2
end
set @sum2 =
case
when @opo3 = '*' then @num3*@num4
when @opo3 = '+' then @num3+@num4
when @opo3 = '-' then @num3-@num4
when @opo3 = '/' then @num3*1.0000000000000000000/@num4
end
set @sum3 =
case
when @opo2 = '*' then @sum1*@sum2
when @opo2 = '+' then @sum1+@sum2
when @opo2 = '-' then @sum1-@sum2
when @opo2 = '/' then @sum1*1.0000000000000000000/@sum2
end
end
else if substring(@patern , 1 ,len(@patern) ) = '(no((non)on))'
begin
set @sum1 =
case
when @opo2 = '*' then @num2*@num3
when @opo2 = '+' then @num2+@num3
when @opo2 = '-' then @num2-@num3
when @opo2 = '/' then @num2*1.00000000000000000000/@num3
end
set @sum2 =
case
when @opo3 = '*' then @sum1*@num4
when @opo3 = '+' then @sum1+@num4
when @opo3 = '-' then @sum1-@num4
when @opo3 = '/' then @sum1*1.00000000000000000000/@num4
end
set @sum3 =
case
when @opo1 = '*' then @num1*@sum2
when @opo1 = '+' then @num1+@sum2
when @opo1 = '-' then @num1-@sum2
when @opo1 = '/' then @num1*1.00000000000000000000/@sum2
end
end
else if substring(@patern , 1 ,len(@patern) ) = '((no(non))on)'
begin
set @sum1 =
case
when @opo2 = '*' then @num2*@num3
when @opo2 = '+' then @num2+@num3
when @opo2 = '-' then @num2-@num3
when @opo2 = '/' then @num2*1.00000000000000000000/@num3
end
set @sum2 =
case
when @opo1 = '*' then @num1*@sum1
when @opo1 = '+' then @num1+@sum1
when @opo1 = '-' then @num1-@sum1
when @opo1 = '/' then @num1*1.00000000000000000000/@sum1
end
set @sum3 =
case
when @opo3 = '*' then @sum2*@num4
when @opo3 = '+' then @sum2+@num4
when @opo3 = '-' then @sum2-@num4
when @opo3 = '/' then @sum2*1.00000000000000000000/@num4
end
end
else if substring(@patern , 1 ,len(@patern) ) = '(no(no(non)))'
begin
set @sum1 =
case
when @opo3 = '*' then @num3*@num4
when @opo3 = '+' then @num3+@num4
when @opo3 = '-' then @num3-@num4
when @opo3 = '/' then @num3*1.00000000000000000000/@num4
end
set @sum2 =
case
when @opo2 = '*' then @num2*@sum1
when @opo2 = '+' then @num2+@sum1
when @opo2 = '-' then @num2-@sum1
when @opo2 = '/' then @num2*1.00000000000000000000/@sum1
end
set @sum3 =
case
when @opo1 = '*' then @num1*@sum2
when @opo1 = '+' then @num1+@sum2
when @opo1 = '-' then @num1-@sum2
when @opo1 = '/' then @num1*1.00000000000000000000/@sum2
end
end
RETURN (@ret2)
END
GO