期待热心的朋友帮助:sql 如何改造这个自定义函数?自定义函数中如何使用case语句?
create function jfe(@kmdm varchar(20),@yf varchar(2))
returns float
as
begin
declare @jfe float
--如果月份的值是01
if @yf= '01 ' set @jfe=(select sum(isnull(j,0)) from pz01 where kmdm like @kmdm + '% ')
else
if @yf= '02 ' set @jfe=(select sum(isnull(j,0)) from pz02 where kmdm like @kmdm + '% ' )
else
if @yf= '03 ' set @jfe=(select sum(isnull(j,0)) from pz03 where kmdm like @kmdm + '% ' and bmry like @bmdm + '% ')
else
if @yf= '04 ' set...
一共12个选项,也就是对应表名pz 01到12...,因为是函数好像无法传递表名进来
请问这里如何改成使用case语句提高效率?
return @jfe
end
我听说使用存储过程可以提高效率,比如上面的表名可以直接通过表名变量传递进来使用,就不需要上面的12个if语句了.
但我实际运用的时候遇到这样的问题:
在delphi中我通过
var aa:float;
ADOQuery1.Sql.Text:= 'select dbo.jfe( '1001 ', '02 ',,,)-dbo.jfe( '1002 ', '02 ',,,) as aa ';
ADOQuery1.Open;
aa:=ADOQuery1.fieldbyname( 'aa ').asfloat;
好像delphi中要获得存储过程返回的值还是比较麻烦的...
函数可以用select 直接进行加减乘除运算,也就是自由组合函数进行运算...
但如果换成存储过程的话就不能这样使用了吧?
请问有什么好的解决办法吗?
菜鸟很期盼与热心朋友讨论...谢谢了
------解决方案--------------------create function jfe(@kmdm varchar(20),@yf varchar(2))
returns float
as
begin
declare @jfe float
set @jfe=case when @yf= '01 ' then (select sum(isnull(j,0)) from pz01 where kmdm like @kmdm + '% ')
when @yf= '02 ' then (select sum(isnull(j,0)) from pz02 where kmdm like @kmdm + '% ' )
when @yf= '03 ' then (select sum(isnull(j,0)) from pz03 where kmdm like @kmdm + '% ' and bmry like @bmdm + '% ')
when @yf= '04 ' then ..... end
return @jfe
end