Немогу получить данные из хранимой процедуры
От: Slavich 1 Украина  
Дата: 21.02.07 12:26
Оценка:
Всем добрый день

Может кто нить подмогнет, с возникшей проблемкой

Есть таблица в которой хранится структура (используется для построения иерархического меню)

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


Проблема:
При проходе цикла каждые предыдущие данные заменяются на текущие (насколько я понял) и
соответственно процедура выдает информацию только о самом верхнем уровне структуры.
Каким образом можно вытащить из процедуры весь набор данных? Или может я не на правильном пути
Re: Немогу получить данные из хранимой процедуры
От: shelkovnikov Россия  
Дата: 22.02.07 07:44
Оценка:
Здравствуйте, Slavich 1, Вы писали:

это нормальное поведение для mssql (этот сервер используется)

варианты правильного решения
* цикл реализовать в клиенте
* извлекать на клиента всю таблицу и строить дерево
* данные про дочерние записи помещать во временную таблицу в цикле и возывращать на клиента селектом
* ...
Re: Немогу получить данные из хранимой процедуры
От: AndrSYash Россия  
Дата: 22.02.07 08:02
Оценка:
Здравствуйте, Slavich 1, Вы писали:

...

S1> WHILE (@ID_PARENT > 0)

S1> BEGIN
S1> SELECT @OBJID = OM.Id,
S1> @PARENTID = OM.Parent_Id,
@NAMEPARENT = OM.Name + '/' + @NAMEPARENT,
S1> @LEVELPARENT = OM.Level
S1> FROM "ObjectMenu" OM
S1> WHERE OM.Id = @ID_PARENT
S1> Set @ID_PARENT = @PARENTID
S1> END
S1> /*SET NOCOUNT OFF*/

...
Re[2]: Немогу получить данные из хранимой процедуры
От: Slavich 1 Украина  
Дата: 22.02.07 09:00
Оценка:
Спасибо всем за помощь
Re: Немогу получить данные из хранимой процедуры
От: Ватакуси Россия  
Дата: 22.02.07 12:47
Оценка:
Еще можно 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]
Все будет Украина!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.