2012-10-20 4 views
-1

난 그냥 10에 1을 인쇄 할 CTE와 함께 재생하거나 12개월복수 노조

create table eventlist 
    (
    id int identity(1,1) not null, 
    edate smalldatetime 
) 
    select * from eventlist 

    insert into eventlist select '01/01/2012' 




    ;with cte AS 
    (
     select edate from eventlist 
     union all 

     select dateadd(M,1,edate) from cte where MONTH(edate)<12 


    ) 

    select MONTH(edate), YEAR (edate) from cte 

인쇄 갑자기 난 그냥이

;with cte AS 
    (
     select edate from eventlist 
     union all 

     select dateadd(M,1,edate) from cte where MONTH(edate)<12 
     union all 
     select dateadd(Y,1,edate) from cte where YEAR(edate)<2013 

    ) 

    select MONTH(edate), YEAR (edate) from cte 
같은 CTE에 또 다른 조합 모든 seciton을 결합하고

내가 이걸 실행하면이 오류가 발생합니다.

성명이 종료되었습니다. 명령문 완료 전에 최대 재귀 100이 모두 소모되었습니다.

내가 인해 recurssion의 한계하지만 i just want to understand how will this recurssion will work ?

+2

하면 (MAXRECURSION = 365) 재귀 제한을 변경 나를 처음 할 알릴 수 기억 ' 재귀를 먼저 이해하려면 재귀를 이해해야합니다. ' – danihp

+0

2012 년과 2013 년 또는 2012 년과 2013 년의 모든 달의 첫 번째 달을 원하십니까? –

답변

1

Y하지 년, DateOfYear의 약자로이 오류를 이해합니다. yy 또는 yyyy 또는 더 나은 year을 사용해보십시오.

오류는 재연 제한을 초과했기 때문에 발생합니다. CTE에 날짜 ('2012-01-01')부터 시작하여 매월 (재귀) 단계에서 다음 날 ('2012-01-01' 첫 번째 단계) (첫 번째 단계는 '2012-01-02')을 생성하도록 요청하고 있습니다. 그런 다음 두 번째 단계에서 네 번째 행을 생성해야합니다. 두 번째 행은 첫 번째 단계에서 생성 된 행을 새로 만듭니다. 그런 다음 8, 16 등 (조건 MONTH(edate)<12은 11 번째 단계에서 2^10 개의 새 행을 생성 한 후에 만 ​​유효하며 그 다음 단계에서도 다음 단계에서 생성되는 행의 수를 약간 제한합니다. 재귀 제한이 없다면 원래의 쿼리는 수백만 행을 생성합니다).

따라서 CTE는 예상대로 24 개의 행을 반환하지 않고 이중 재귀 때문에 (Y에서 으로 변경하더라도) CTE를 반환합니다.

사용이 :

; with cte AS 
(
    select edate from eventlist 
    union all 
    select dateadd(Month,1,edate) from cte where MONTH(edate)<12 
) 

, cte2 AS 
(
    select edate from cte 
    union all 
    select dateadd(Year,1,edate) from cte2 where YEAR(edate)<2013 
) 

select MONTH(edate), YEAR(edate) from cte2 ; 

또는 내 생각이다이 하나 간단한 :

; with cte AS 
(
    select edate from eventlist 
    union all 
    select dateadd(Month,1,edate) from cte where edate < '2013-12-01' 
) 

select MONTH(edate), YEAR(edate) from cte ;