代码之家  ›  专栏  ›  技术社区  ›  Paco

我可以在SQLServer2005视图中使用递归吗?

  •  4
  • Paco  · 技术社区  · 16 年前

    我试着用 OPTION (MAXRECURSION 0) 以生成日期列表。

    编辑以解释我实际想要做的事情:

    我有两张桌子。

    表1:int工作日,bool可用

    表2:datetime日期,bool可用

    视图1:日期(此处为今年的所有天数),可用(来自表2或不在表2中时来自表1)。

    这意味着我必须在工作日的某个日期申请加入。

    我发现以下代码用于生成递归:

    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())
    )
    
    3 回复  |  直到 16 年前
        1
  •  2
  •   Community CDub    7 年前

    No -如果你能找到一种在100个递归级别(有一个数字表)内完成的方法,这将使你在100个递归级别内完成,你就能够做到。但是如果你有一个数字或数据透视表,你就不需要递归了。。。

    看见 this question this question this link this link

        2
  •  0
  •   TcKs    16 年前

    你可以使用 CTE 用于分层查询。

        3
  •  0
  •   Stefan Steiger Marco van de Voort    12 年前

    ;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
    ;