您可以在表格用户定义的函数中使用WITH语句吗?

时间:2008-11-20 22:30:01

标签: sql sql-server-2005 tsql

我有一个UDF的以下代码,但它错误地显示消息:

  

Msg 156,Level 15,State 1,Procedure   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 个答案:

答案 0 :(得分:1)

据我所知,UDF中不允许使用OPTION MAXRECURSION。问题connect.microsoft.com处有一个项目。

答案 1 :(得分:1)

不,您不能使用OPTION关键字。

从文档:“MAXRECURSION可用于防止形成不良的递归CTE进入无限循环。下面的示例有意创建一个无限循环,并使用MAXRECURSION提示将递归级别的数量限制为两个。”

如果你解释一下你想要查询的内容(你希望最终结果是什么样的),我们可以编写一个不需要递归的更好的SQL语句。

答案 2 :(得分:0)

你错过了一个结束括号吗? (“AS RETURN”的结束括号(“

答案 3 :(得分:0)

您无法在UDF中使用OPTION。此外,由于UDF通常以高容量调用,因此使用Numbers表生成日期范围可能更有意义(在表中抛出几千个数字 - 比如从1到1,000,000)并生成日期范围表在UDF中。

这是一个使用这样一个实用程序表的link to a good set of techniques - 通常称为Numbers表或Pivot表。