2012-06-27 5 views
4

я получил ниже хранимую процедуру, чтобы вернуть список Id, ParentID и absoluteUrls, который работает отлично:Как получить иерархические данные из таблицы SQL?

ALTER PROCEDURE [dbo].[SearchDataManager.HierarchyById] 
    @currentId AS int 
AS 
BEGIN 
DECLARE @id INT 
DECLARE @parentId INT 
DECLARE @absoluteUrl NVARCHAR(1000) 

DECLARE @Hierarchy TABLE (Id int, ParentId int, AbsoluteUrl nvarchar(1000)) 

WHILE @currentId != 0 
BEGIN 

    SELECT @id = Id, @parentId = ParentId, @absoluteUrl = AbsoluteUrl 
    FROM dbo.[SearchDataManager.NiceUrls] 
    WHERE id = @currentId 

    INSERT INTO @Hierarchy VALUES (@id, @parentId, @absoluteUrl) 

    SET @currentId = @parentId 
END 

    SELECT * FROM @Hierarchy 
END 

«NiceUrls» таблица Id и ParentID. parentId ссылается на запись в той же таблице.

возвращается как:

---------------------------------- 
    Id | ParentId | AbsoluteUrl 
    ---------------------------------- 
    294 | 5  | url1 
    5 | 2  | url2 
    2 | 0  | url3 

Приведенный выше код работает отлично с помощью цикла WHILE и определить переменную таблицы, но мне просто интересно, есть ли лучший способ для извлечения иерархии данных из таблицы?

Проблема с вышеуказанным кодом - ремонтопригодность. Если мне нужно будет вернуть еще 1 столбец таблицы NiceUrls, мне нужно будет определить новую переменную, добавить столбец во встроенную таблицу и т. Д.

Есть ли лучший способ переписать sp?

Спасибо,

Что

+3

Рекурсивный CTE должен делать то, что вам нужно - http://msdn.microsoft.com/en-us/library/ms186243(v=sql.105).aspx –

ответ

16
with Hierarchy (Id, ParentId, AbsoluteUrl, Level) 
AS 
(
    -- anchor member 
    SELECT Id, 
     ParentId, 
     AbsoluteUrl, 
     0 AS Level 
    FROM dbo.[NiceUrls] 
    WHERE id = @currentId 
    UNION ALL 
    -- recursive members 
    SELECT su.Id, 
     su.ParentId, 
     su.AbsoluteUrl, 
     Level + 1 AS Level 
    FROM dbo.[NiceUrls] AS su 
    INNER JOIN Hierarchy ON Hierarchy.ParentId = su.Id 
) 
SELECT * FROM Hierarchy 
1

Похоже, вы хотите, чтобы все записи из исходной таблицы, которые связаны с первоначальным идентификатором.

1) Создайте КТР, который дает вам все идентификаторы (ссылка Тройной указано)

2) Присоединиться к этой КТР к исходной таблице

Смежные вопросы