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

  • 主题发起人 主题发起人 cnhotel
  • 开始时间 开始时间
C

cnhotel

Unregistered / Unconfirmed
GUEST, unregistred user!
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...
[blue] 一共12个选项,也就是对应表名pz 01到12...,因为是函数好像无法传递表名进来
请问这里如何改成使用case语句提高效率?[/blue]
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中要获得存储过程返回的值还是比较麻烦的...

[red]函数可以用select 直接进行加减乘除运算,也就是自由组合函数进行运算...
但如果换成存储过程的话就不能这样使用了吧?[/red]
请问有什么好的解决办法吗?

菜鸟很期盼与热心朋友讨论...谢谢了
 
等了一个晚上都没人问津,郁闷
 
declare @sql varchar(1000)
set @sql='set @jfe=(select sum(isnull(j,0)) from pz02 where kmdm like @kmdm +'%' ) ' --这句要改一下,主要注意一下你的变量就行了
exec(@sql )
 
谢谢楼上支持

你说的是指在过程中那样改动么?

在函数内按你提示的修改:
declare @jfe decimal(18,2),@sql varchar(1000)
set @sql='select convert(varchar,sum(isnull(j,0))) from pz'+@yf+' where kmdm like '''+@kmdm+'%'''
exec(@sql )
[red]:在函数内不正确地使用了 'EXECUTE'。:[/red]
请问是什么原因?

请问在我上述的函数中可以使用case语句么?
 
唉,大富翁的人呢,是因为我的问题太低级么.
 
接受答案了.
 
后退
顶部