Табличнозначная функция с рекурсивным 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ý
..................................................................................................................