Sql server 2005 SQLServer2005中的递归存储过程

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

我有一个包含以下字段的表“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             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