У меня есть похожий ответ - но собрав его, я хочу опубликовать его;)
declare @Data table (
ID int not null,
Name varchar(50) not null,
ParentID int null
);
insert into @Data
select 1, 'Root', null
union select 2, 'Business', 1
union select 3, 'Finance', 1
union select 4, 'Stock', 3;
declare @UserInput int;
set @UserInput = 4;
with cParents as (
select d.ID, d.Name, d.ParentID
from @Data d
where d.ID = @UserInput
union all
select d.ID, d.Name, d.ParentID
from cParents c
inner join @Data d
on d.ID = c.ParentID
),
cChildren as (
select d.ID, d.Name, d.ParentID
from @Data d
where d.ID = @UserInput
union all
select d.ID, d.Name, d.ParentID
from cChildren c
inner join @Data d
on d.ParentID = c.ID
)
select RecordType='self', d.ID, d.Name, ParentName=isnull(p.Name,'')
from @Data d
left join @Data p
on p.ID = d.ParentID
where d.ID = @UserInput
union all
select RecordType='parents', d.ID, d.Name, ParentName=isnull(p.Name,'')
from cParents d
left join @Data p
on p.ID = d.ParentID
where d.ID <> @UserInput
union all
select RecordType='children', d.ID, d.Name, ParentName=isnull(p.Name,'')
from cChildren d
left join @Data p
on p.ID = d.ParentID
where d.ID <> @UserInput;
@ Данные представляют собой данные примера, @UserInput - входная переменная.Я добавил RecordType, чтобы прояснить смысл частей записи.Он протестирован на SQL Server 2008 и должен работать в 2005 году, но не в 2000 году.