Запрос CTE с 2 условиями не работает? - PullRequest
1 голос
/ 26 октября 2011

Я родился в 1978 году / 12/22

Я хотел, чтобы запрос (в CTE!) Отображал все мои дни рождения (datepart day = 22)

declare @t0 datetime  = '1978/12/22';
declare @t1 datetime  = getdate();


 with CTEE (val,day1)
AS
(
    SELECT @t0,DATEPART(day,@t0)
    UNION   all
    SELECT DATEADD(day,1,val) , DATEPART(day,day1) from  ctee where( DATEADD(day,1,val) <=@t1)   and DATEPART(day,day1)=22
)
select val,day1 from CTEE OPTION (MAXRECURSION 20000) 

Как бы то ни было, это возвращает мне 1 строку ( почему ???)

If I remove and DATEPART(day,day1)=22 так что это дает мне все дни, когда я живу.

Решение, которое я нашел, таково:

  declare @t0 datetime  = '1978/12/22';
    declare @t1 datetime  = getdate();


     with CTEE (val,day1)
    AS
    (
        SELECT @t0,DATEPART(day,@t0)
        UNION   all
        SELECT DATEADD(day,1,val) , DATEPART(day,day1) from  ctee where( DATEADD(day,1,val) <=@t1)  

    )
    select val,day1 from CTEE where day1=22  OPTION (MAXRECURSION 20000) 

Но мой вопрос , почему в первом запросе это не сработало?

1 Ответ

0 голосов
/ 26 октября 2011

Потому что вторая запись 1978-12-23.

Это не соответствует условию DATEPART(day,day1)=22, так что рекурсивный шаг не возвращает результатов, это прерывает рекурсию, как описано в Электронная документация по SQL Server

Проверка завершения неявна;рекурсия останавливается, если после предыдущего вызова строки не возвращаются.

...