表值函递归CTE

0

的问题

只是为了好玩,我想写一个表,尊贵的功能,以产生一个表格的日期。 为测试目的,我很难编码的价值观念应该是通过变量。

就其本身而言,这一工作:

WITH cte AS (
    SELECT cast('2021-10-01' AS date) AS date
    UNION ALL
    SELECT dateadd(day,1,date) FROM cte WHERE date<current_timestamp
)
SELECT * FROM cte OPTION(maxrecursion 0);

注意到 OPTION 在结束。

作为一个功能,它不会的工作,除非我删除了 OPTION 条款在结束:

CREATE FUNCTION dates(@start date, @rows INT) RETURNS TABLE AS
RETURN
WITH cte AS (
    SELECT cast('2021-10-01' AS date) AS date
    UNION ALL
    SELECT dateadd(day,1,date) FROM cte WHERE date<current_timestamp
)
SELECT * FROM cte   --  OPTION(maxrecursion 0)
;

对测试数据,这是确定的,但它肯定会失败,如果我给它的日期在今年年初,因为它涉及超过100递归.

是否有一个正确的语法用于这一点,或者是Microsoft的另一个怪癖,它需要一个解决方法?

1

最好的答案

0

觉得 这可能是答案。

在回答另一个问题,@GarethD国:

如果你想看更多的存储查询于一个存储查询的...记住,它的定义被扩展到主要的查询...

(不正确的语法接近的关键词"选项"在CTE发言).

如果是这种情况下,便不能包括任何东西可能不被包括在一个子查询。 这包括 ORDER BY 条款和提示例如 OPTION.

我还没有确定,但我可以猜测,这同样适用于一个表,尊贵的功能。 如果是这样,答案是否定的,有没有办法包括 OPTION 条款。

注意,其他数据库管理系统更容置在什么可以包括在子查询,所以我不想他们有相同的限制。

2021-11-28 09:29:14

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................