2008-10-31 54 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 
; 
相关问题