Рекурсивная хранимая процедура в SQL Server 2005 - PullRequest
0 голосов
/ 08 ноября 2011

У меня есть таблица «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

Как я могу это сделать?

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2011
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
0 голосов
/ 08 ноября 2011

Для этого я создаю новую временную таблицу:

#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 
...