Всем добрый день
Может кто нить подмогнет, с возникшей проблемкой
Есть таблица в которой хранится структура (используется для построения иерархического меню)
CREATE TABLE "ObjectMenu"
(
"Id" INT NOT NULL PRIMARY KEY, /* ключевое поле идентифицирует запись (также по нем иденифицируется родитель) */
"Parent_Id" INT NOT NULL, /* ID родителя, данные наследуются с поля Id */
"Level" INT DEFAULT 0, /* уровень потомка */
"Name" VARCHAR(200) /*Название пункта*/
);
GO
Создаем процедуру, возвращающую цепочку от выбранного уровня, до корневого элемента @ID_PARENT — ID выбранного элемента
CREATE PROCEDURE GET_PARENTS
@ID_PARENT INT,
@OBJID INT OUTPUT,
@PARENTID INT OUTPUT,
@NAMEPARENT VARCHAR(200) OUTPUT,
@LEVELPARENT INT OUTPUT/*,*/
AS
/*SET NOCOUNT ON*/
WHILE (@ID_PARENT > 0)
BEGIN
SELECT @OBJID = OM.Id,
@PARENTID = OM.Parent_Id,
@NAMEPARENT = OM.Name,
@LEVELPARENT = OM.Level
FROM "ObjectMenu" OM
WHERE OM.Id = @ID_PARENT
Set @ID_PARENT = @PARENTID
END
/*SET NOCOUNT OFF*/
GO
Проблема:
При проходе цикла каждые предыдущие данные заменяются на текущие (насколько я понял) и
соответственно процедура выдает информацию только о самом верхнем уровне структуры.
Каким образом можно вытащить из процедуры весь набор данных? Или может я не на правильном пути
Еще можно CTE использовать (MSSQL 2005)
WITH [cte] (ID, ParentID)
AS
(
SELECT ID, ParentID
FROM Specifications
WHERE ID = @anID
UNION ALL
SELECT S.ID, S.ParentID
FROM Specifications S
JOIN [cte]
ON S.ParentID = [cte].ID
)
SELECT *
FROM [cte]