Просто для удовольствия я пытаюсь написать функцию с табличным значением для создания таблицы дат. В целях тестирования я жестко кодирую значения, которые должны передаваться в переменных.
Само по себе это работает:
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, которая нуждается в обходном пути?