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

Откуда: Москва
Сообщений: 2646
 ;WITH cte_event (id, obj_id, obj_type_id, obj_name) AS
    (
        SELECT 
            t.id,
            t.obj_id, 
            t.obj_type_id, 
            ISNULL(t.obj_name, '') AS obj_name
        FROM #temp_event AS t
        UNION ALL
        SELECT 
            t.id,
            t.obj_id, 
            t.obj_type_id, 
            ISNULL(c.obj_name, '') + ', ' + ISNULL(t.obj_name, '')
        FROM #temp_event AS t
            INNER JOIN cte_event c
            ON t.id = c.id + 1
                AND t.obj_id = c.obj_id
                AND t.obj_type_id = c.obj_type_id
    ),
    cte_events (obj_id, obj_type_id, obj_name, len_name) AS
    (
        SELECT 
            c.obj_id,
            c.obj_type_id,
            c.obj_name,
            len_name = LEN(c.obj_name)
        FROM cte_event c
    )  
    SELECT 
        r.obj_id,
        r.obj_type_id,
        r.obj_name
    INTO #events    
    FROM cte_events r
        INNER JOIN
        (   SELECT
                r.obj_id, 
                r.obj_type_id,
                max_len_name = MAX(r.len_name)
            FROM cte_events r
            GROUP BY r.obj_id, r.obj_type_id
        ) AS q
        ON r.obj_id = q.obj_id
            AND r.obj_type_id = q.obj_type_id
            AND r.len_name = q.max_len_name

-- Ошибка:
--Types don't match between the anchor and the recursive part in column "obj_name" of recursive query "cte_event".

Эта ошибка то есть, то её нет т.е. не всегда воспроизводится. Фрагмент процедуры привел, выше.
Microsoft SQL Server 2012 - 11.0.2100.60 (X64)

Помогите разобраться.
27 ноя 12, 10:19    [13534342]     Ответить | Цитировать Сообщить модератору
 Re: ошибка, рекурсия в cte (sql 2012)  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
используйте явное преобразование типов
27 ноя 12, 10:23    [13534369]     Ответить | Цитировать Сообщить модератору
 Re: ошибка, рекурсия в cte (sql 2012)  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Knyazev Alexey
используйте явное преобразование типов

пример:

set nocount on

--Работает
;with cte as
(
select '123' as i
union all
select '123' from cte
where 1 != 1
)
select * from cte
go

--Не работает
;with cte as
(
select '123' as i
union all
select '12' from cte 
where 1 != 1
)
select * from cte
go

--Пэтому через явное приведение типов:
;with cte as
(
select cast( '123' as varchar(3) ) as i
union all
select cast( '12'  as varchar(3) ) from cte
where 1 != 1
)
select * from cte
go
27 ноя 12, 10:35    [13534460]     Ответить | Цитировать Сообщить модератору
 Re: ошибка, рекурсия в cte (sql 2012)  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Knyazev Alexey,

Спасибо за пример, помог разобраться!
27 ноя 12, 10:49    [13534563]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить