79573069

Date: 2025-04-14 11:50:05
Score: 2
Natty:
Report link

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

Reasons:
  • Long answer (-1):
  • No code block (0.5):
  • User mentioned (1): @ret2
  • User mentioned (0): @jp1
  • User mentioned (0): @jp1
  • User mentioned (0): @opo1
  • User mentioned (0): @opo2
  • User mentioned (0): @opo3
  • User mentioned (0): @opostrn
  • User mentioned (0): @num1
  • User mentioned (0): @num1char
  • User mentioned (0): @num1cwnt
  • User mentioned (0): @num1char
  • User mentioned (0): @num1cwnt
  • User mentioned (0): @num1
  • User mentioned (0): @num2
  • User mentioned (0): @num2char
  • User mentioned (0): @num2cwnt
  • User mentioned (0): @num2char
  • User mentioned (0): @num2cwnt
  • User mentioned (0): @num3
  • User mentioned (0): @num3char
  • User mentioned (0): @num3cwnt
  • User mentioned (0): @num3char
  • User mentioned (0): @num3cwnt
  • User mentioned (0): @num4
  • User mentioned (0): @num4char
  • User mentioned (0): @num4cwnt
  • User mentioned (0): @num4char
  • User mentioned (0): @num4cwnt
  • User mentioned (0): @sum1
  • User mentioned (0): @sum2
  • User mentioned (0): @sum3
  • User mentioned (0): @sum4
  • User mentioned (0): @sum5
  • User mentioned (0): @sum6
  • User mentioned (0): @curval
  • User mentioned (0): @prevval
  • User mentioned (0): @mathstrn
  • User mentioned (0): @loopval
  • User mentioned (0): @strlen
  • User mentioned (0): @patern
  • User mentioned (0): @numflag
  • User mentioned (0): @patern
  • User mentioned (0): @prevval
  • User mentioned (0): @mathstrn
  • User mentioned (0): @strlen
  • User mentioned (0): @loopval
  • User mentioned (0): @loopval
  • User mentioned (0): @strlen
  • User mentioned (0): @curval
  • User mentioned (0): @curval
  • User mentioned (0): @curval
  • User mentioned (0): @curval
  • User mentioned (0): @opo1
  • User mentioned (0): @curval
  • User mentioned (0): @opo2
  • User mentioned (0): @curval
  • User mentioned (0): @opo3
  • User mentioned (0): @curval
  • User mentioned (0): @curval
  • User mentioned (0): @num1cwnt
  • User mentioned (0): @num2cwnt
  • User mentioned (0): @num3cwnt
  • User mentioned (0): @num4cwnt
  • User mentioned (0): @prevval
  • User mentioned (0): @curval
  • User mentioned (0): @patern
  • User mentioned (0): @patern
  • User mentioned (0): @patern
  • User mentioned (0): @patern
  • User mentioned (0): @patern
  • User mentioned (0): @patern
  • User mentioned (0): @patern
  • User mentioned (0): @patern
  • User mentioned (0): @num1
  • User mentioned (0): @num2
  • User mentioned (0): @num3
  • User mentioned (0): @num4
  • User mentioned (0): @patern
  • User mentioned (0): @patern
  • User mentioned (0): @sum1
  • User mentioned (0): @sum1
  • User mentioned (0): @num1
  • User mentioned (0): @sum1
  • User mentioned (0): @opo1
  • User mentioned (0): @opo1
  • User mentioned (0): @opo1
  • User mentioned (0): @opo1
  • User mentioned (0): @sum2
  • User mentioned (0): @opo2
  • User mentioned (0): @opo2
  • User mentioned (0): @opo2
  • User mentioned (0): @opo2
  • User mentioned (0): @opo3
  • User mentioned (0): @sum5
  • User mentioned (0): @sum2
  • User mentioned (0): @num4
  • User mentioned (0): @sum6
  • User mentioned (0): @sum5
  • User mentioned (0): @sum4
  • User mentioned (0): @ret2
  • User mentioned (0): @sum1
  • User mentioned (0): @opo3
  • User mentioned (0): @opo3
  • User mentioned (0): @opo3
  • User mentioned (0): @ret2
  • User mentioned (0): @patern
  • User mentioned (0): @sum1
  • User mentioned (0): @opo1
  • User mentioned (0): @opo1
  • User mentioned (0): @opo1
  • User mentioned (0): @opo1
  • User mentioned (0): @sum2
  • User mentioned (0): @opo3
  • User mentioned (0): @opo3
  • User mentioned (0): @opo3
  • User mentioned (0): @opo3
  • User mentioned (0): @sum3
  • User mentioned (0): @opo2
  • User mentioned (0): @opo2
  • User mentioned (0): @opo2
  • User mentioned (0): @opo2
  • User mentioned (0): @sum1
  • User mentioned (0): @opo2
  • User mentioned (0): @opo2
  • User mentioned (0): @opo2
  • User mentioned (0): @opo2
  • User mentioned (0): @sum2
  • User mentioned (0): @opo3
  • User mentioned (0): @opo3
  • User mentioned (0): @opo3
  • User mentioned (0): @opo3
  • User mentioned (0): @sum3
  • User mentioned (0): @opo1
  • User mentioned (0): @opo1
  • User mentioned (0): @opo1
  • User mentioned (0): @opo1
  • User mentioned (0): @sum1
  • User mentioned (0): @opo2
  • User mentioned (0): @opo2
  • User mentioned (0): @opo2
  • User mentioned (0): @opo2
  • User mentioned (0): @sum2
  • User mentioned (0): @opo1
  • User mentioned (0): @opo1
  • User mentioned (0): @opo1
  • User mentioned (0): @opo1
  • User mentioned (0): @sum3
  • User mentioned (0): @opo3
  • User mentioned (0): @opo3
  • User mentioned (0): @opo3
  • User mentioned (0): @opo3
  • User mentioned (0): @sum1
  • User mentioned (0): @opo3
  • User mentioned (0): @opo3
  • User mentioned (0): @opo3
  • User mentioned (0): @opo3
  • User mentioned (0): @sum2
  • User mentioned (0): @opo2
  • User mentioned (0): @opo2
  • User mentioned (0): @opo2
  • User mentioned (0): @opo2
  • User mentioned (0): @sum3
  • User mentioned (0): @opo1
  • User mentioned (0): @opo1
  • User mentioned (0): @opo1
  • User mentioned (0): @opo1
  • Filler text (0.5): nnnnnnnnn
  • Filler text (0): nnnnnnnn
  • Filler text (0): 00000000000000000000
  • Filler text (0): 0000000000000000000
  • Filler text (0): 00000000000000000000
  • Filler text (0): 00000000000000000000
  • Filler text (0): 0000000000000000000
  • Filler text (0): 0000000000000000000
  • Filler text (0): 0000000000000000000
  • Filler text (0): 00000000000000000000
  • Filler text (0): 00000000000000000000
  • Filler text (0): 00000000000000000000
  • Filler text (0): 00000000000000000000
  • Filler text (0): 00000000000000000000
  • Filler text (0): 00000000000000000000
  • Filler text (0): 00000000000000000000
  • Filler text (0): 00000000000000000000
  • Filler text (0): 00000000000000000000
  • Low reputation (1):
Posted by: Joe Boyle