Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Ошибка в рекурсивном запросе  [new]
kesean
Member

Откуда:
Сообщений: 2
Прошу помощи.
Есть таблица
DECLARE @p TABLE (id INT, name NCHAR(100), obj_id CHAR(10), parent CHAR(10))

В ней данные
INSERT @p SELECT 0,'Иванов','IVA','0' /*big boss*/
INSERT @p SELECT 1,'Петров','PETR','IVA' /*Подчинен Иванову*/
INSERT @p SELECT 2,'Васечкин','VAS','IVA' /*Подчинен Иванову*/
INSERT @p SELECT 3,'Сидоров','CID','PETR' /*Подчинен Петрову*/
INSERT @p SELECT 4,'Пупкин','PUP','PETR' /*Подчинен Петрову*/
INSERT @p SELECT 5,'Гадюков','GAD','PUP' /*Подчинен Пупкину*/
INSERT @p SELECT 6,'Котов','KOT','GAD' /*Подчинен Гадюкову*/
INSERT @p SELECT 7,'Непоймикто','NONAME','KOT' /*Подчинен Котову*/

Хочу построить дерево подчинения, чтобы на выходе иметь что-то типа

ИвановИванов
ПетровИванов/Петров
ВасечкинИванов/Васечкин
СидоровИванов/Петров/Сидоров
ПупкинИванов/Петров/Пупкин
ГадюковИванов/Петров/Пупкин/Гадюков
КотовИванов/Петров/Пупкин/Гадюков/Котов
НепоймиктоИванов/Петров/Пупкин/Гадюков/Котов/Непоймикто


Как-то так:
with  tree (id_t, name_t, level_t, path_t)
as (select id, name, 0, name
   from @p
   where parent='0'
union all
   select p.id, 
	   p.name, 
	   tree.level_t + 1, 
	   tree.name_t + ' / ' + p.name 
   from @p p
     inner join tree on tree.id_t = p.parent)

Ловлю исключение
Types don't match between the anchor and the recursive part in column "path_t" of recursive query "tree".
Какие типы не совпадают?
1 дек 16, 21:28    [19957464]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в рекурсивном запросе  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
kesean,

ну, там же написано in column "path_t".
в случае с рекурсивным cte такая ошибка будет выдаваться в том числе и если в якорной части у столбца тип, например, varchar(100), а в рекурсивсивной уже varchar(200).
надо явно к одному типу привести.

with  tree (id_t, name_t, level_t, path_t)
as (select id, name, 0, cast(name as varchar(max))
   from @p
   where parent='0'
union all
   select p.id, 
	   p.name, 
	   tree.level_t + 1, 
	   cast(tree.name_t + ' / ' + p.name as varchar(max)) 
   from @p p
     inner join tree on tree.id_t = p.parent)
1 дек 16, 21:45    [19957514]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в рекурсивном запросе  [new]
kesean
Member

Откуда:
Сообщений: 2
daw, спасибо за ответ (я уже все к text привел :))
1 дек 16, 22:03    [19957575]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в рекурсивном запросе  [new]
iljy
Member

Откуда:
Сообщений: 8711
kesean
(я уже все к text привел :))


а вот это зря. У типа text в принципе дофига ограничений, ну и его отменить планируют в конце концов. Так что не учитесь плохому сразу
1 дек 16, 22:33    [19957689]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить