2008-10-31 96 views
4

我試圖在視圖中使用OPTION (MAXRECURSION 0)來生成日期列表。 這似乎是不受支持的。有沒有解決這個問題的方法?我可以在Sql Server 2005視圖中使用遞歸嗎?

編輯解釋什麼我其實想做的事:

我有2個表。

表1:INT工作日,布爾提供

表2:日期時間日期,布爾提供

我想要的結果: 廠景:日期(這裏在今年的所有天),用(從表2或table1不在表2中時)。

這意味着我必須在一個工作日的日期申請加入。 我希望這個解釋是可以理解的,因爲我實際上在查詢中使用更多的表格和更多的字段。

我發現這個代碼來生成遞歸:

WITH Dates AS 
(
    SELECT cast('2008-01-01' as datetime) Date 
    UNION ALL 
    SELECT Date + 1 
    FROM Dates 
    WHERE Date + 1 < DATEADD(yy, 1, GETDATE()) 
) 
+0

我通過與日期和星期幾爲列數據庫中創建一個額外的表解決了這個問題。我在2037年爲下一個開發人員設置了千年蟲... – Paco 2008-11-01 16:01:15

回答

2

No - 如果您可以找到一種方法來在100個迴避水平(有一個數字表格)內完成它,這將使您在100個遞歸級別內完成,您將可以完成此操作。但是,如果你有一個數字或數據透視表,你將不需要反正遞歸...

this question(但我會創建一個表,而不是表值函數),this questionthis linkthis link

0

可以使用CTE分層查詢。

+0

這是CTE還是我錯過了什麼? – Paco 2008-10-31 16:58:59

+0

這是一個CTE,但遞歸級別在視圖中限制爲100(或更早,如果遞歸在CTE中以一些標準自然終止)。 – 2008-10-31 18:23:04

0

在這裏你去:

;WITH CTE_Stack(IsPartOfRecursion, Depth, MyDate) AS 
(
    SELECT 
     0 AS IsPartOfRecursion 
     ,0 AS Dept 
     ,DATEADD(DAY, -1, CAST('01.01.2012' as datetime)) AS MyDate 
    UNION ALL 

    SELECT 
     1 AS IsPartOfRecursion 
     ,Parent.Depth + 1 AS Depth 
     --,DATEADD(DAY, 1, Parent.MyDate) AS MyDate 
     ,DATEADD(DAY, 1, Parent.MyDate) AS MyDate 
    FROM 
    (
     SELECT 0 AS Nothing 
    ) AS TranquillizeSyntaxCheckBecauseWeDontHaveAtable 

    INNER JOIN CTE_Stack AS Parent 
     --ON Parent.Depth < 2005 
     ON DATEADD(DAY, 1, Parent.MyDate) < DATEADD(YEAR, 1, CAST('01.01.2012' as datetime)) 
) 

SELECT * FROM CTE_Stack 
WHERE IsPartOfRecursion = 1 
OPTION (MAXRECURSION 367) -- Accounting for leap-years 
; 
相關問題