![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Димамическое добавление имени "владельца" к текущей записи [D7, MSSQL]
Rav © (2007-02-18 20:58:00)Доброго времени суток!
Есть таблица с полями (иерархическая структура "дерево")
ID int NOT NULL - ключ
OWNER_ID int NULL - ссылка на запись "владельца"
NAME str64 NULL - какой либо текст
Можно либо каким-либо образом при "динамически" получить поле OWNER_NAME_ROOT\OWNER_NAME_1\...\NAME, т.е. сгенерить своего рода "путь", например для записи
"ОТДЕЛ 1" получить "ООО РОГА И КОПЫТА\ФИЛИАЛ 10\ОТДЕЛ 1"
Можно ссылку на статью, где почитать.
Спасибо!
Ega23 (2007-02-19 17:59:00) [1]
> Common Table Expressions (CTE) ?
Не знаю, я ещё не ковырял.
Кщд (2007-02-19 13:53:00) [2]Ega23 © (19.02.07 13:01) [8]
>Кстати, говорят, что в 2005 какие-то механизмы интересные для рекурсий >появились...
синтаксис, на мой взгляд, более громоздкий и менее прозрачный, нежели в oracle
но факт присутствия - бесспорен)
Empleado (2007-02-19 13:22:00) [3]
> Кстати, говорят, что в 2005 какие-то механизмы интересные
> для рекурсий появились...
Common Table Expressions (CTE) ?
Ega23 (2007-02-19 13:01:00) [4]
> novill © (19.02.07 12:10) [7]
Я просто столько рекурсий за последний год на TSQL написал, что меня уже тошнит только од одного упоминания о них... :)
Кстати, говорят, что в 2005 какие-то механизмы интересные для рекурсий появились...
novill (2007-02-19 12:10:00) [5]> [6] Ega23 © (19.02.07 11:33)
Да
Ega23 (2007-02-19 11:33:00) [6]
> Рекурсивная ХП - самое разумное.
не надо тут никаких рекурсий. Здесь нет обхода "от корня к листу", тут обратный - "от листа к корню". Достаточно While с условием Owner_ID is null
novill (2007-02-19 11:12:00) [7]Рекурсивная ХП - самое разумное.
ЮЮ (2007-02-19 11:02:00) [8]Можно и UDF. В предложенном варианте, правда наоборот, root в конец помещается, да и разделяется только пробелами, но смысл, надююсь, понятен
CREATE FUNCTION dbo._UeDepartment_GetFullShortName(
@Department int, @OnDate datetime
) RETURNS varchar(255) AS BEGIN
-- возвращает цепочку аббревиатур подразделений
-- <ShortName> <Parent.ShortName> <Parent.Parent.ShortName>
DECLARE @Result varchar(255)
DECLARE @Parent int
DECLARE @ShortName varchar(255)
SELECT
@Result = ShortName, @Parent = ParentDepartment
FROM E_Newdepartments
WHERE ID = dbo.UeDepartment_GetLastNewDepartment(@Department, @OnDate, 0, 0)
WHILE @Parent > 0 BEGIN
SELECT
@ShortName = ShortName, @Parent = ParentDepartment
FROM E_Newdepartments
WHERE
ID = dbo.UeDepartment_GetLastNewDepartment(@Parent, @OnDate, 0, 0)
SET @Result = @Result + ' ' + @ShortName
END
RETURN @Result
END
Val (2007-02-19 10:18:00) [9]с оглядкой на сервер, подозреваю, что нужно создавать хп.
Rav (2007-02-18 21:15:00) [10]
> неизвестное OWNER_NAME_ROOT
Ну это я так обозначил не совсем правильно....
Имеется в виду корневая запись (поле NAME), затем 2 уровень (поле NAME).... и т.д. до нужной записи (поле NAME)
Anatoly Podgoretsky (2007-02-18 21:04:00) [11]> Rav (18.02.2007 20:58:00) [0]
Можно конечно, обычное вычислимое поле, только вот смущают неизвестное OWNER_NAME_ROOT и таинственное ...