原帖地址:
http://community.csdn.net/Expert/topic/3190/3190686.xml?temp=.6296961
表test中记录:
aa bb
001 50.5
002 60
003 15.4
004 25
005 48
...
输入任一金额,然后在表中查找是否有该金额或几条记录的合计等于该金额.
如:输入25,则要找出004,输入85,则要找出002与004,依次类推。
------------------------------------------------------------------------------------
--测试数据
create table test(aa varchar(10),bb numeric(10,2))
insert test select '001',50.5
union all select '002',60
union all select '003',15.4
union all select '004',25
union all select '005',48
union all select '006',37
go
--查询函数
create function fn_search(@Num numeric(10,2))
returns @r table (aa varchar(10),bb numeric(10,2))
as
begin
declare @t table (aa varchar(8000),aa1 varchar(10),bb numeric(10,2),level int)
declare @l int
insert @r select aa,bb from test where bb=@num
if @@rowcount>0 goto lb_exit
set @l=0
insert @t select ','+aa+',',aa,bb,@l from test where bb<@num
while @@rowcount>0
begin
insert @r select distinct a.aa,a.bb
from test a,(
select a.aa,a.bb,aa1=b.aa from test a,@t b
where b.level=@l
and b.aa1<a.aa
and a.bb=@num-b.bb
)b where a.aa=b.aa or charindex(','+a.aa+',',b.aa1)>0
if @@rowcount>0 goto lb_exit
set @l=@l+1
insert @t select b.aa+a.aa+',',a.aa,a.bb+b.bb,@l
from test a,@t b
where b.level=@l-1
and b.aa1<a.aa
and a.bb<@num-b.bb
end
lb_exit:
return
end
go
--调用测试1
select * from dbo.fn_search(25)
/*--结果
aa bb
---------- ------------
004 25.00
(所影响的行数为 1 行)
--*/
--调用测试2
select * from dbo.fn_search(135.5)
/*--结果
aa bb
---------- ------------
001 50.50
002 60.00
004 25.00
005 48.00
006 37.00
(所影响的行数为 5 行)
--*/
--调用测试3(找不到的,无返回值)
select * from dbo.fn_search(135.7)
/*--结果
aa bb
---------- ------------
(所影响的行数为 0 行)
--*/
go
drop table test
drop function fn_search