я получил ниже хранимую процедуру, чтобы вернуть список 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?
Спасибо,
Что
Рекурсивный CTE должен делать то, что вам нужно - http://msdn.microsoft.com/en-us/library/ms186243(v=sql.105).aspx –