在 SQL Server 中获取最大递归 100 错误

问题描述 投票:0回答:1

此查询在不到 100 个日期内正常运行。

DECLARE @startDate DATETIME
DECLARE @endDate DATETIME
DECLARE @cols AS NVARCHAR(max)
DECLARE @query AS NVARCHAR(max)
DECLARE @startDate1 NVARCHAR(max)
DECLARE @endDate1 NVARCHAR(max)

SET @startDate = '2023/04/01'
SET @endDate = '2023/12/31'
SET @startDate1 = '2023/04/01'
SET @endDate1 = '2023/12/31';

WITH dates(date) AS 
(
    SELECT @startdate AS Date
    UNION ALL
    SELECT DATEADD(d, 1, [date])
    FROM dates 
    WHERE date < @enddate 
)
SELECT 
    @cols = STUFF((SELECT ',' + Quotename((CONVERT(VARCHAR(100), [date], 103))) AS [Date]
                   FROM dates 
                   FOR XML PATH(''), TYPE).Value('.', 'NVARCHAR(MAX)'), 1, 1, '')

我收到此错误:

声明终止。在语句完成之前,最大递归 100 已用完。

尝试使用选项(maxrecursion 0),但它在 SQL Server 中显示语法错误。

有人可以帮我吗?

sql sql-server
1个回答
0
投票

根据我的评论,这里不需要递归;这是实现目标的“最慢”方法之一(仅比循环更好)。只需查询您的日历表即可。另外,我假设您使用的是最新版本的 SQL Server,因此可以访问 STRING_AGG

DECLARE @startDate date,
        @endDate date,
        @cols AS NVARCHAR(max), -- Not used?
        @query AS NVARCHAR(max), -- Not used?
        @startDate1 date,
        @endDate1 date;

SET @startDate = '20230401';
SET @endDate = '20231231';
SET @startDate1 = '20230401'; -- Not used?
SET @endDate1 = '20231231'; -- Not used?

SELECT STRING_AGG(CONVERT(nvarchar(MAX),QUOTENAME(CONVERT(nvarchar(10),CT.CalendarDate,103))),',') WITHIN GROUP (ORDER BY [date]) --nvarchar(MAX) as if the string ends up longer than 4,000 you'll get an error
FROM dbo.CalendarTable CT
WHERE CT.CalendarDate >= @startDate
  AND CT.CalendarDate < @endDate;

如果您出于某种原因

,有一个日历表,那就制作一个(超出了这个问题的范围,但有 1,000 篇关于如何实现这一目标的文章)。 如果出于某种原因,您拒绝制作日历表,正如我在评论中提到的那样,

不要

使用递归。相反,使用 Tally,它的性能要好得多。我在这里切换回“旧”方法,以防您仍在使用 SQL Server 2016-: FOR XML PATH('')


© www.soinside.com 2019 - 2024. All rights reserved.