问一个递归函数返回值的问题
CREATE function f_GetChild(@code int)
returns @t table(code int)
as
begin
declare @t_temp table(id int identity(1,1),child int)
insert into @t(code)
select Class_Id from Info_Class where Parent_Id = @code
insert into @t_temp(child)
select Class_Id from Info_Class where Parent_Id= @code
declare @child_temp int,@max_id int,@min_id int
select @max_id = max(id),@min_id = min(id) from @t_temp
while @min_id <= @max_id
begin
select @child_temp = child from @t_temp where id = @min_id
insert into @t(code)
select * from dbo.f_GetChild(@child_temp)
select @min_id = @min_id + 1
end
end
return
end
这是我从网上找的一个递归函数,执行后发现如果有记录的就会正常返回递归的值 如果没有记录就返回空。我想加一个判断 如果没有记录的时候就返回传进来的参数即返回@code 应该怎么办? 我曾试着在填充记录的时候用纪录数来判断却没有成功不知道为什么
------解决方案--------------------在return前加一段
if not exists(select 1 from @t)
insert into @t
select @code
------解决方案--------------------:-)
你试一下当你的嵌套次数增加时会出现什么情况!
------解决方案--------------------函数嵌套无论在哪里都不能直接加,(你return 上多了一个end)
可这样考虑,在while后加思路是对的,但还缺少关健一环,怎么判断一次都未进入嵌套?
可设置一变量(declare @i int),在while前设置为(set @i=1)
在while中设为增1( set @i=@i+1) 若为1说明未进入嵌套
此时只要判断@max_id 或@min_id的值是否为空就可以了 (
if @max_id is null and @i=1
insert into @t select @code
也可不定义 @i 判断@min_id 但万一@t_temp中的min(id)=0就要了错了。
------解决方案--------------------楼上的老兄已经正解了!