Можете ли вы иметь оператор WITH в табличной пользовательской функции - PullRequest
2 голосов
/ 21 ноября 2008

У меня есть следующий код для UDF, но он выдает сообщение об ошибке:

Сообщение 156, Уровень 15, Состояние 1, Процедура CalendarTable, строка 39 неверна синтаксис рядом с ключевым словом «OPTION».

это из-за моего оператора WITH, так как я могу нормально выполнить тот же код в хранимой процедуре?

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      Anthony Main
-- Create date: 18/11/08
-- Description: Produce Table of Dates for Month
-- =============================================
CREATE FUNCTION CalendarTable
(   
    @StartDate DATETIME,
    @EndDate DATETIME
)
RETURNS TABLE 
AS
RETURN 
(
    with    MyCalendar as
            (
            select  cast(@StartDate as datetime) DateValue
            union   all
            select  DateValue + 1
            from    MyCalendar   
            where   DateValue + 1 <= @EndDate
            )

    select  DateValue
    ,       datepart(dy, DateValue) [day of year]
    ,       datename(dw, DateValue) [day]
    ,       datepart(dw, DateValue-1) [day of week]
    ,       datepart(dd, DateValue) [day of month]
    ,       datepart(ww, DateValue) [week]
    ,       datepart(mm, DateValue) [month]
    ,       datename(mm, DateValue) [month]
    ,       datepart(qq, DateValue) [quarter]
    ,       datepart(yy, DateValue) [year]
    ,       datepart(HH, DateValue) [HOUR]
    ,       datepart(MI, DateValue) [MIN]
    ,       datepart(SS, DateValue) [SEC]
    ,       datepart(MS, DateValue) [MILLISECOND]
    from    MyCalendar
    OPTION  (MAXRECURSION 0)
)
GO

Ответы [ 4 ]

1 голос
/ 21 ноября 2008

Из того, что я могу сказать, OPTION MAXRECURSION не разрешено в UDF. На странице connect.microsoft.com имеется сообщение об этой проблеме.

1 голос
/ 26 ноября 2008

Нет, вы не можете использовать ключевое слово OPTION.

Из документации: «MAXRECURSION можно использовать для предотвращения попадания плохо сформированного рекурсивного CTE в бесконечный цикл. В следующем примере намеренно создается бесконечный цикл и используется подсказка MAXRECURSION, чтобы ограничить количество уровней рекурсии до двух».

Если вы объясните, что вы хотите запросить (как вы хотите, чтобы конечные результаты выглядели), мы могли бы написать более качественный оператор SQL, который не нуждается в рекурсии.

0 голосов
/ 26 ноября 2008

Вы не можете использовать ВАРИАНТ в UDF. Кроме того, поскольку пользовательские функции обычно вызываются в большом объеме, возможно, имеет смысл сгенерировать диапазон дат с помощью таблицы Numbers (например, вы бросаете несколько тысяч чисел в таблицу - скажем, от 1 до 1 000 000) и создаете таблицу диапазонов дат в UDF от этого.

Вот ссылка на хороший набор методов , в которых используется такая служебная таблица, часто называемая таблицей чисел или сводной таблицей.

0 голосов
/ 21 ноября 2008

Вам не хватает закрывающей скобки здесь? (закрывающая скобка для "AS RETURN ("

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