需要创建一个存储过程,实现对于一个数据表中的数据进行统计。不同的字段统计的方式不同,有的是统计最大值,有的是最小值,有的是平均值,还有的是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值字段直接用之前计算的值代替。