Использование максимальной рекурсии в CTE для создания CTE, а не только в последнем операторе SELECT - PullRequest
0 голосов
/ 14 апреля 2019

Я хочу создать столбец дат между заранее определенной датой начала и окончания и сохранить результат в CTE для использования в моем запросе.Приведенный ниже рекурсивный метод работает, но использование maxrecursion в CTE не представляется возможным.Есть ли другой способ обойти это?

(1) Это прекрасно работает:

DECLARE @startnum INT=1
DECLARE @endnum INT=10000
;
WITH gen AS (       
    SELECT @startnum AS num
    UNION ALL
    SELECT num+1 FROM gen WHERE num+1<=@endnum
)

SELECT * FROM gen
option (maxrecursion 10000)

(2) Это не будет работать:

DECLARE @StartDate DATE; 
DECLARE @EndDate DATE;
SET @StartDate = '20150406'; 
SET @EndDate = '20190406';

DECLARE @startnum INT=1
DECLARE @endnum INT=10000
;
WITH gen AS (       
    SELECT @startnum AS num
    UNION ALL
    SELECT num+1 FROM gen WHERE num+1<=@endnum
)
,

num_list as (
SELECT * FROM gen
option (maxrecursion 10000)
)
,

tab_dates as (
SELECT  DATEADD(DAY, nbr - 1, @StartDate) AS Dates
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY c.num) AS Nbr
          FROM      num_list c
        ) nbrs
WHERE   nbr - 1 <= DATEDIFF(DAY, @StartDate, @EndDate)
)
SELECT * FROM tab_dates

Ответы [ 2 ]

3 голосов
/ 14 апреля 2019

Вместо использования RBAR rCTE используйте Tally.Вы можете использовать CTE, чтобы сделать это тоже.Таким образом, вы не будете страдать от проблемы максимальной рекурсии, и она будет намного быстрее:

WITH N AS (
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL)) N(N)),
Tally AS(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
    FROM N N1 --10
         CROSS JOIN N N2 --100
         CROSS JOIN N N3 --1000
         CROSS JOIN N N4 --10000
    )
SELECT *
FROM Tally;

С помощью приведенного выше примера вы можете продолжать увеличивать число CROSS JOIN до N в подсчете CTE, и выувеличит количество строк в 10 раз.

2 голосов
/ 14 апреля 2019

Вы добавляете опцию maxrecursion в конце последнего выбора.Опция применяется ко всем CTE.

Думайте обо всем этом как об одном утверждении, которым оно является.

Я знаю, это кажется нелогичным.Я был смущен, когда впервые столкнулся с этой проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...