CTE查询有2个条件不起作用?

时间:2011-10-25 21:43:33

标签: sql-server common-table-expression

我出生于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) 

这怎么回事我一行(为什么 ???)

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 :(得分:0)

因为第二条记录是1978-12-23

这不符合DATEPART(day,day1)=22条件,因此递归步骤不返回任何结果,这将终止递归,如SQL Server Books Online

中所述
  

终止检查是隐含的;没有行时递归停止   从上一次调用返回。