首页 新闻 会员 周边 捐助

sql执行公式

0
悬赏园豆:20 [已关闭问题] 关闭于 2012-06-29 10:24

如何设计,执行。

例如: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'

想请教一种更好的设计,和实现方法

天蓝若空的主页 天蓝若空 | 初学一级 | 园豆:9
提问于:2012-06-26 10:55
< >
分享
所有回答(4)
0

定义相对应的用户函数吧!

Angkor--:-- | 园豆:1086 (小虾三级) | 2012-06-26 11:05

在sql2000里定义有函数。但是在sql2005和08里边不管用

支持(0) 反对(0) 天蓝若空 | 园豆:9 (初学一级) | 2012-06-28 16:43
0

建议换种思路,如果是以字符串存储的应该不能用SQL执行,除非切割字符串然后拼接,这样会很麻烦

artwl | 园豆:16736 (专家六级) | 2012-06-26 11:16
0

问题问得有点泛。

这个应该是一个查询条件吧?希望动态的执行这个查询条件?

下面我能想到的是使用SQL字符串,通过动态生成SQL字符串,然后再执行这条SQL语句。

无之无 | 园豆:5095 (大侠五级) | 2012-06-26 11:17

x*70%+y*30%>=500这个是存储的公式,在调用的时候 会把x y替换成具体的数字,然后执行公式得到结果返回,这是一张专门存储公式的表,我输入x y值查询所有执行之后成立的公式

支持(0) 反对(0) 天蓝若空 | 园豆:9 (初学一级) | 2012-06-28 16:42

@天蓝若空: 

也就是说x, y是变量了?那你可以在数据库里存储为@x和@y?

如果可以,那么:

就可以继续回到我之前的回答上来解决。

 

你可以贴几个实际的数据,然后你期望的SQL脚本。

支持(0) 反对(0) 无之无 | 园豆:5095 (大侠五级) | 2012-06-28 16:44

@笨笨蜗牛: 

实际数据:

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

      

支持(0) 反对(0) 天蓝若空 | 园豆:9 (初学一级) | 2012-06-28 17:45

@天蓝若空: 

简单的,可以通过替换的形式把数据代入进去。即通过replace实现。

复杂点,就需要定义一个表达式解析器,由表达式解析器来识别表达式并执行。这样做就有点难度了。

支持(0) 反对(0) 无之无 | 园豆:5095 (大侠五级) | 2012-06-28 19:20
0
declare  a=x*70%  int;
declare  b=y*30%  int;
select * from table case(a+b>=50) then istrue
不知道你想要的是不是这个意思

 

程序新青年 | 园豆:841 (小虾三级) | 2012-06-26 16:19

select a.*, (case(a+b>=50) then istrue else end)
from table a

楼主应该是这个意思吧

支持(0) 反对(0) massinger | 园豆:706 (小虾三级) | 2012-06-27 11:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册