使用存储过程代替自定义函数计算CP95

需要创建一个存储过程,实现对于一个数据表中的数据进行统计。不同的字段统计的方式不同,有的是统计最大值,有的是最小值,有的是平均值,还有的是cp95值(即将所有数据从小打大进行排序,选择前95%个值中最大的值。计算cp95值的方式在之前一篇文章中有提到《存储过程获取第n个最大值》)。起初的想法是通过创建自定义聚合函数实现cp95值的统计,实现效果类似于系统函数max等。

select max(A),min(B),avg(C),cp95(D)
from tb_test

但是实现却很复杂,需要用C#实现函数模块,再在sql server中定义这个函数。也使数据库的部署带来很大的麻烦,因为一般情况下数据库是由用户安装,我们只提供数据库文件和脚本。

后来又想用简单的标量值或表值函数来实现,但是函数的实现有很多限制,无法执行动态sql。最后只能通过存储过程实现,接口为cp95字段名和表名,在存储过程构建cp95查询计算语句,返回计算结果。

接下来又遇到另外一个问题,想要把存储过程返回值放到select语句中,像使用函数那样使用存储过程,类似

select max(A), min(B), avg(C), exec cp95 'D','tb_test'
from tb_test

这种方法是不允许的,想要select 存储过程结果,只能通过链接数据库的方式。所以只能进行分步执行的方式,先计算出cp95值,用变量保存。动态构建select 语句,将cp95值字段直接用之前计算的值代替。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值