【问题标题】:Can I use recursion in a Sql Server 2005 View?我可以在 Sql Server 2005 视图中使用递归吗?
【发布时间】:2010-09-20 05:22:50
【问题描述】:

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

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

我有 2 张桌子。

table1: int weekday, bool 可用

table2: datetime date, bool 可用

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

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

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

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

【问题讨论】:

  • 我通过在数据库中创建一个以日期和星期几作为列的额外表解决了这个问题。我当时为下一个开发者设置了2037年的千年虫……

标签: sql sql-server recursion


【解决方案1】:

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

参见this question(但我会创建一个表而不是表值函数),this questionthis linkthis link

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这是 CTE 还是我遗漏了什么?
    • 这是一个 CTE,但递归级别在视图中被限制为 100(或更早,如果递归在 CTE 中的某些条件下自然终止)。
    【解决方案3】:

    给你:

    ;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-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 2010-12-15
    • 2010-10-02
    • 2010-10-31
    相关资源
    最近更新 更多