【发布时间】:2016-06-15 09:14:50
【问题描述】:
我有这个函数,给定一个初始日期和最后一个日期,给出该范围内的相应年/月:
CREATE FUNCTION [dbo].[fnYearMonth]
(
@Initial Date,
@Final Date
)
RETURNS TABLE
AS
RETURN
With dateRange(StatDate) as
(
select @Initial
union all
select dateadd(month, 1, StatDate)
from dateRange
where dateadd(month, 1, StatDate) <= CAST(DATEADD(month,DATEDIFF(month,0,@Final)+1,0)-1 as Date)
)
select DATEPART(year, StatDate) AS MyYear, DATEPART(month, StatDate) AS MyMonth From dateRange where StatDate <= @Final
问题在于 MAXRECURSION 的默认限制为 100 只提供最多 8 年零 4 个月的可用日期范围。这还不够。
我尝试使用“OPTION (MAXRECURSION 2000);”在使用此函数但不起作用的函数中,因为我在 WITH 语句中调用了此函数。
我现在唯一的解决方案是将这个内联函数变成一个多语句函数并使用“OPTION (MAXRECURSION 2000);”。但出于性能原因,我宁愿避免使用此选项。 ¿ 还有其他选择吗?
感谢您的帮助。
【问题讨论】:
-
您必须在最后一个查询中使用
OPTION (MAXRECURSION ...)。例如,我得到了带有递归 cte 的函数,我在另一个 cte 中运行这个函数,然后从中选择。我将在最后一个 SELECT 中使用OPTION (MAXRECURSION ...)。
标签: sql sql-server tsql inline-table-function