Sql server 2005 SQLServer2005中的递归存储过程
我有一个包含以下字段的表“tReferences”:Sql server 2005 SQLServer2005中的递归存储过程,sql-server-2005,stored-procedures,recursive-query,Sql Server 2005,Stored Procedures,Recursive Query,我有一个包含以下字段的表“tReferences”: IDFILE [int], NAME [varchar(255)], IDREFERENCE [int] 1 FILE1 0 2 FILE2 0 3 FILE3 0 4 FILE4 1 5 FILE5 4 6 FILE6 4 7
IDFILE [int],
NAME [varchar(255)],
IDREFERENCE [int]
1 FILE1 0
2 FILE2 0
3 FILE3 0
4 FILE4 1
5 FILE5 4
6 FILE6 4
7 FILE7 2
8 FILE8 3
我必须创建一个递归存储过程,它可以显示特定IDFILE的所有引用
结果:
IDFILE NAME LEVEL
1 FILE1 0
4 FILE4 1
5 FILE5 2
6 FILE6 2
我该怎么做
非常感谢。为此,我创建了一个新的临时表:
#tempT (
IDFILE [int],
NAME [varchar(255)],
IDREFERENCE [int]
level int
)
我以这种方式填充此表:
declare @parent int;
declare @level int;
set @parent = 1
set @level = 0
insert into #tempT
select * from tReferences where IDFILE = @parent
while @@rowcount > 0
begin
insert into #tempT
select *, @level from tReferences
where
IDREFERENCE in (select IDFILE from #tempT )
and
IDFILE not in (select IDFILE from #tempT )
set @level = @level + 1
end
然后,我回来了
select idfile, name, level from #tempT
create table #tempT (
IDFILE int,
[NAME] varchar(255),
[IDREFFERENCE] int,
[level] int
)
declare @idfile int, @idref int, @level int, @flag int;
declare @name varchar(max);
set @flag=0;
set @level=0;
DECLARE limit_cursor cursor for
select IDFILE,[NAME],IDREFFERENCE FROM tReferences
open limit_cursor
fetch next from limit_cursor into @idfile,@name,@idref
while(@@fetch_status=0)
begin
if(@idref=0)
begin
if(@flag=0)
begin
insert into #tempT values (@idfile,@name,@idref,0);
set @flag=1;
end
end
else if(@idref not in (select IDREFFERENCE from #tempT))
begin
set @level=@level+1;
insert into #tempT values (@idfile,@name,@idref,@level)
end
else if(@idref in (select IDREFFERENCE from #tempT))
begin
set @level=(select [level] from #tempT where @idref=IDREFFERENCE group by [level])
insert into #tempT values (@idfile,@name,@idref,@level)
end
fetch next from limit_cursor into @idfile,@name,@idref
end
close limit_cursor
deallocate limit_cursor
select IDFILE,[NAME],[level] from #tempT
truncate table #tempT