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

Откуда: Feorina "Fury" 161
Сообщений: 4339
Самый каноничный рекурсивный запрос ниже.
Таблица представляет собой
id parent_id name
1 1 Сделать отчёт в ворде
2 1 открыть ворд
3 1 написать текст
4 3 подумать
5 3 почесать и-нет
6 1 закрыть ворд

with Tree(Id, Parent_ID, Name, level, s)
AS
(
    select
        Id
        , Parent_ID
        , Name
        , 0
        , cast(id as nvarchar(500)) s 
    from tasks
    where Id=Parent_ID
    union all
    select
        a.Id
        , a.Parent_ID
        , a.Name
        , Tree.level+1
        , cast(a.id as nvarchar(500)) + '_' + cast(Tree.Id as nvarchar(500)) s
    from tasks a
    inner join Tree on Tree.Id = a.Parent_ID
    where a.id != a.Parent_ID
)
Select ID, space(level)+name
from Tree a
order by s

А ошибка у меня
Types don't match between the anchor and the recursive part in column "s" of recursive query "Tree".

Её не будет, если убрать столбец сортировки s. Я его сделал для того, чтобы можно было потом отсортировать по нему.
Как решить эту проблему?
24 дек 18, 13:15    [21771974]     Ответить | Цитировать Сообщить модератору
 Re: Почему рекурсивный запрос?  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Charles Weyland
Как решить эту проблему?
Привести поля к одному типу.
id - целого типа? Тогда зачем длина строки 500? Целый тип никогда не превышает 11 символов, включая знак.
24 дек 18, 13:21    [21771983]     Ответить | Цитировать Сообщить модератору
 Re: Почему рекурсивный запрос?  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4339
iap
Charles Weyland
Как решить эту проблему?
Привести поля к одному типу.
id - целого типа? Тогда зачем длина строки 500? Целый тип никогда не превышает 11 символов, включая знак.

все поля одного типа. Убираю выделенное красным и всё работает как должно.
не важно, почему там 500. Да хоть 5 напишу, хоть 10, хоть 100. Это не меняет сути.

with Tree(Id, Parent_ID, Name, level, s)
AS
(
    select
        Id
        , Parent_ID
        , Name
        , 0
        , cast(id as nvarchar(500)) s 
    from tasks
    where Id=Parent_ID
    union all
    select
        a.Id
        , a.Parent_ID
        , a.Name
        , Tree.level+1
        , cast(a.id as nvarchar(500)) + '_' + cast(Tree.Id as nvarchar(500)) s
    from tasks a
    inner join Tree on Tree.Id = a.Parent_ID
    where a.id != a.Parent_ID
)
Select ID, space(level)+name
from Tree a
order by s
24 дек 18, 13:26    [21771992]     Ответить | Цитировать Сообщить модератору
 Re: Почему рекурсивный запрос?  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
Charles Weyland
iap
пропущено...
Привести поля к одному типу.
id - целого типа? Тогда зачем длина строки 500? Целый тип никогда не превышает 11 символов, включая знак.

все поля одного типа. Убираю выделенное красным и всё работает как должно.
не важно, почему там 500. Да хоть 5 напишу, хоть 10, хоть 100. Это не меняет сути.

with Tree(Id, Parent_ID, Name, level, s)
AS
(
    select
        Id
        , Parent_ID
        , Name
        , 0
        , cast(id as nvarchar(500)) s 
    from tasks
    where Id=Parent_ID
    union all
    select
        a.Id
        , a.Parent_ID
        , a.Name
        , Tree.level+1
        , cast(a.id as nvarchar(500)) + '_' + cast(Tree.Id as nvarchar(500)) s
    from tasks a
    inner join Tree on Tree.Id = a.Parent_ID
    where a.id != a.Parent_ID
)
Select ID, space(level)+name
from Tree a
order by s


как же это они у вас одного типа, если в первом случае у вас nvarchar(500)
а во втором nvarchar(500)+char+nvarchar(500)?
24 дек 18, 13:33    [21772004]     Ответить | Цитировать Сообщить модератору
 Re: Почему рекурсивный запрос?  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4339
понял, спасибо.
Привёл тип cast для всего выражения. Всё работает.
24 дек 18, 13:38    [21772010]     Ответить | Цитировать Сообщить модератору
 Re: Почему рекурсивный запрос?  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Charles Weyland,

во втором случае (теоретически) допускается, что текст будет 1000 юникодных символа?
А в первом - не более 500?
И вы при этом утверждаете, что это один и тот же тип?
Уж не гуманитарий ли вы? :))
24 дек 18, 13:41    [21772020]     Ответить | Цитировать Сообщить модератору
 Re: Почему рекурсивный запрос?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7752
Посетитель,

'_' никак не NVARCHAR. N'_' - это NVARCHAR.
24 дек 18, 18:15    [21772353]     Ответить | Цитировать Сообщить модератору
 Re: Почему рекурсивный запрос?  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4339
iap
Charles Weyland,

во втором случае (теоретически) допускается, что текст будет 1000 юникодных символа?
А в первом - не более 500?
И вы при этом утверждаете, что это один и тот же тип?
Уж не гуманитарий ли вы? :))

блин. Ну точно.
гуманитарий. Привёл всё к одной длине, заработало. Логично же блин..
24 дек 18, 19:34    [21772412]     Ответить | Цитировать Сообщить модератору
 Re: Почему рекурсивный запрос?  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
Владислав Колосов
Посетитель,

'_' никак не NVARCHAR. N'_' - это NVARCHAR.


еще бы понять, на что же вы ответили.
25 дек 18, 09:11    [21772665]     Ответить | Цитировать Сообщить модератору
 Re: Почему рекурсивный запрос?  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Владислав Колосов
Посетитель,

'_' никак не NVARCHAR. N'_' - это NVARCHAR.
Неявное приведение типа.
Пример:
SELECT SQL_VARIANT_PROPERTY(CAST(CAST('1234567890' AS NVARCHAR(10))+'_'+CAST('0987654321' AS NVARCHAR(10))AS SQL_VARIANT),'MaxLength');
25 дек 18, 09:52    [21772685]     Ответить | Цитировать Сообщить модератору
 Re: Почему рекурсивный запрос?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7752
Посетитель
Владислав Колосов
Посетитель,

'_' никак не NVARCHAR. N'_' - это NVARCHAR.


еще бы понять, на что же вы ответили.


Промахнулся с адресатом :) Это автору комментарий.
25 дек 18, 12:10    [21772812]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить