期待热心的朋友帮助:sql 如何改造这个自定义函数?自定义函数中如何使用case语句?

默默唐 2007-04-21 09:34:51
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 直接进行加减乘除运算,也就是自由组合函数进行运算...
但如果换成存储过程的话就不能这样使用了吧?
请问有什么好的解决办法吗?

菜鸟很期盼与热心朋友讨论...谢谢了
...全文
236 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2007-04-21
  • 打赏
  • 举报
回复
函数内只支持扩展存储过程
默默唐 2007-04-21
  • 打赏
  • 举报
回复
在函数内执行 exec (@sql)这类的语句提示"在函数内不正确地使用了 'EXECUTE'。",是因为函数内不支持exec的语法嘛?
默默唐 2007-04-21
  • 打赏
  • 举报
回复
谢谢楼上的指明如何使用case语法.
一会接分...

还想再问下的是:
用函数可以使用下面的语句来组合加减乘除四则运算运算
select jfe('1001','01')-jfe('1002','02')+jfe('1005','01')...直接可以得到最终值
如果将上面的函数改成过程,也能进行刚才的select操作么?如果不能可以有其他的方法实现吗?
中国风 2007-04-21
  • 打赏
  • 举报
回复
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

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧