此查询在不到 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 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('')