我能在 Sql Server 2005 视图中使用递归吗?

4
我尝试在视图中使用 OPTION (MAXRECURSION 0) 来生成一个日期列表,但这似乎不被支持。是否存在解决此问题的方法?
编辑以说明我真正想做的事情:
我有两个表。
table1: int weekday, bool available table2: datetime date, bool available 我希望得到的结果是:view1: date(今年内的所有日期), available(从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())
)

我通过在数据库中创建一个额外的表格,其中包含日期和星期几作为列来解决了这个问题。我将千年虫设置为2037年,留给下一个开发人员处理... - Paco
3个回答

2

No - 如果你能在100个递归级别内找到一种方法来完成它(有一个数字表),这将使你在100个递归级别内完成,那么你就可以做到。但是,如果你有一个数字或数据透视表,你根本不需要递归...

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


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
;

这不适用于视图内,这也是问题的关键所在。提示需要放在视图的选择语句中。 - Martin Smith

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

这是CTE,还是我漏了什么? - Paco
这是一个CTE,但递归级别在视图中被限制为100(或者如果CTE中的某些条件自然终止,则提前终止递归)。 - Cade Roux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接