期待热心的朋友帮助: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