我有一个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
答案 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表。