【问题标题】:Can you have a WITH statement in a tabular user defined function您可以在表格用户定义的函数中使用 WITH 语句吗
【发布时间】:2008-11-20 22:30:00
【问题描述】:

我有以下 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

【问题讨论】:

    标签: sql sql-server-2005 tsql


    【解决方案1】:

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

    来自文档:“MAXRECURSION 可用于防止格式不正确的递归 CTE 进入无限循环。以下示例有意创建无限循环并使用 MAXRECURSION 提示将递归级别的数量限制为两个。”

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        您是否在此处缺少右括号? (“AS RETURN (”的右括号

        【讨论】:

        • 是的,但没有解决问题,更新问题以反映新错误
        【解决方案4】:

        您不能在 UDF 中使用 OPTION。此外,由于 UDF 通常被大量调用,因此使用 Numbers 表生成日期范围可能更有意义(您在表中放入几千个数字 - 例如从 1 到 1,000,000)并生成日期范围表在 UDF 中。

        这是一个link to a good set of techniques,它使用了这样一个实用程序表——通常称为数字表或数据透视表。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-19
          • 1970-01-01
          • 2020-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-13
          • 2020-08-28
          相关资源
          最近更新 更多