如何设计,执行。
例如:x*70%+y*30%>=500
这个是存在数据库里的公式,如何用sql去执行公式呢?
在sql2000里边写的自定义函数:
代入数字,替换公式的 x y
ALTER function [dbo].[fun_returnStr] ( @str varchar(2000), --传入的字符串 @numx float, --传入x值 @numy float --传入y值 ) returns varchar(2000) as begin declare @charindex int select @str=replace(@str,'x',@numx) select @str=replace(@str,'y',@numy) select @str=replace(@str,'%','/100') select @charindex=charindex(';',@str) if @charindex<>0 begin if dbo.f_calc(substring(@str,1,@charindex-1))='True' and dbo.f_calc(substring(@str,@charindex+1,len(@str)))='True' select @str='1+1=2' else select @str='1+1=3' end return @str end
执行公式函数
ALTER function [dbo].[f_calc]( @str nvarchar(1000) )returns sql_variant as begin declare @re sql_variant declare @err int,@src varchar(255),@desc varchar(255) declare @obj int exec @err=sp_oacreate 'MSScriptControl.ScriptControl',@obj out if @err<>0 goto lb_err exec @err=sp_oasetproperty @obj,'Language','vbscript' if @err<>0 goto lb_err exec @err=sp_oamethod @obj,'Eval',@re out,@str if @err=0 return(@re) lb_err: exec sp_oageterrorinfo NULL, @src out, @desc out declare @errb varbinary(4),@s varchar(20) set @errb=cast(@err as varbinary(4)) exec master.xp_varbintohexstr @errb,@s out return('错误号: '+@s+char(13)+'错误源: '+@src+char(13)+'错误描述: '+@desc) end
执行公式的函数在sql05和08里边提示exec master.xp_varbintohexstr找不到
select * from rules where dbo.f_calc(dbo.fun_returnStr(rule,@numx,@numy))='True'
想请教一种更好的设计,和实现方法
定义相对应的用户函数吧!
在sql2000里定义有函数。但是在sql2005和08里边不管用
建议换种思路,如果是以字符串存储的应该不能用SQL执行,除非切割字符串然后拼接,这样会很麻烦
问题问得有点泛。
这个应该是一个查询条件吧?希望动态的执行这个查询条件?
下面我能想到的是使用SQL字符串,通过动态生成SQL字符串,然后再执行这条SQL语句。
x*70%+y*30%>=500这个是存储的公式,在调用的时候 会把x y替换成具体的数字,然后执行公式得到结果返回,这是一张专门存储公式的表,我输入x y值查询所有执行之后成立的公式
@天蓝若空:
也就是说x, y是变量了?那你可以在数据库里存储为@x和@y?
如果可以,那么:
就可以继续回到我之前的回答上来解决。
你可以贴几个实际的数据,然后你期望的SQL脚本。
@笨笨蜗牛:
实际数据:
sid rule
1 x*70%+y*70%>=650
2 x*60/400+y*40/750>=73.6
3 x*60/400+y*40/750>=74.5
期望的是一个sql函数可以执行函数,返回符合规则的数据 ,x y在查询时会代入用户输入的数据 如300,500
@天蓝若空:
简单的,可以通过替换的形式把数据代入进去。即通过replace实现。
复杂点,就需要定义一个表达式解析器,由表达式解析器来识别表达式并执行。这样做就有点难度了。
declare a=x*70% int; declare b=y*30% int; select * from table case(a+b>=50) then istrue 不知道你想要的是不是这个意思
select a.*, (case(a+b>=50) then istrue else end)
from table a
楼主应该是这个意思吧