4

我试图OPTION (MAXRECURSION 0)在视图中使用来生成日期列表。这似乎不受支持。这个问题有解决方法吗?

编辑以解释我真正想做的事情:

我有 2 张桌子。

table1: int weekday, bool 可用

表 2:datetime 日期,可用布尔型

我想要结果:view1:日期(这里是今年的所有日子),可用(来自 table2 或来自 table1 时不在 table2 中)。

这意味着我必须在工作日的日期申请加入。我希望这个解释是可以理解的,因为我实际上在查询中使用了更多具有更多字段的表。

我找到了这段代码来生成递归:

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())
)
4

3 回答 3

2

——如果你能在 100 个递归级别内找到一种方法(有一个数字表),这将使你达到 100 个递归级别,你就可以做到。但是,如果您有数字或数据透视表,则无论如何都不需要递归...

看到这个问题(但我会创建一个表而不是表值函数),这个问题这个链接这个链接

于 2008-10-31T18:17:16.047 回答
0

您可以使用CTE进行分层查询。

于 2008-10-31T16:46:38.650 回答
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
;
于 2012-11-16T13:24:51.267 回答