Во-первых, мне интересно, почему вы используете для этого три разных процесса (и я предполагаю три разных таблицы).Иерархическая таблица, например:
(для простоты используется целое число вместо предпочтительного типа первичного ключа uniqueidentifier
)
Тестовая таблица:
create table menu_item
(
id int primary key
,parent_id int foreign key references menu_item(id)
,[description] nvarchar(512)
,sort_order int not null default 0
);
Заполнитетаблица с некоторыми тестовыми данными
insert into menu_item (id, parent_id, [description],sort_order)
select 0, null, 'Menu Root', 0
union all
select 1, 0, 'Item 1', 0
union all
select 2, 0, 'Item 2', 1
union all
select 3, 0, 'Item 3', 2
union all
select 4, 1, 'Item 1.1', 0
union all
select 5, 1, 'Item 1.2', 1
union all
select 6, 4, 'Item 1.1.1', 0
union all
select 7, 4, 'Item 1.1.2', 1
union all
select 8, 2, 'Item 2.1', 0
И сохраненный процесс для извлечения иерархии в правильном порядке.
/*
Retrieve part of the menu hierarchy from table menu_item.
*/
create procedure menu_item_get_hierarchy
as
set nocount on;
with menu_hierarchy as
(
select id, parent_id, 0 as [level], cast('000000' as nvarchar(max)) as sort_key
from menu_item m1
where parent_id is null
union all
select m.id, m.parent_id, [level]+1, cast(sort_key + '.' + right('000000'+cast(m.sort_order as nvarchar(6)),6) as nvarchar(max))
from menu_item m
inner join menu_hierarchy h
on m.parent_id = h.id
)
select menu_item.[description], menu_hierarchy.*
from menu_item inner join menu_hierarchy
on menu_item.id=menu_hierarchy.id
order by sort_key, [description]
Единственная часть этого, которая мне не нравится, - это использованиестроковые операторы для генерации столбца sort_path
, так как он довольно неэффективен, но я не могу придумать лучшего способа сделать это вне головы и количества строк, которые вы, вероятно, имеете в навигационной системене должно вызывать проблем с производительностью.Я уверен, что кто-то поделится некоторыми соображениями или альтернативами.
Есть много других способов сохранить иерархию в одной таблице, но этот самый простой в обслуживании, так как вам нужно только предоставить родителяid при вставке, а отношение внешнего ключа предотвращает потерянные узлы.
Надеюсь, это поможет.