Sql server 递归CTE生成额外记录

Sql server 递归CTE生成额外记录,sql-server,recursion,Sql Server,Recursion,我使用以下递归SQL查询生成日期中提供的任何月份的所有日期 它总是生成额外的日期(下个月1日) 我做错了什么?在递归CTE中,将首先执行递归查询,然后验证Where子句 这是正确的方法 DECLARE @currentDate DATE = '2016-5-25'; ;WITH cte AS( SELECT dateadd(dd,1,eomonth(@currentDate,-1)) AS fd UNION ALL SELECT DATEADD(DAY, 1, fd)

我使用以下递归SQL查询生成日期中提供的任何月份的所有日期

它总是生成额外的日期(下个月1日)


我做错了什么?

递归CTE
中,将首先执行递归查询,然后验证Where子句

这是正确的方法

DECLARE @currentDate DATE = '2016-5-25';

;WITH cte AS(
    SELECT dateadd(dd,1,eomonth(@currentDate,-1)) AS  fd
    UNION ALL
    SELECT DATEADD(DAY, 1, fd) 
    FROM cte
    WHERE fd < eomonth(@currentDate)
)
SELECT * FROM cte

您使用的是哪个版本的SQL Server Microsoft SQL Server 2014-12.0.4213.0(X64)2015年6月9日12:06:16 Windows NT 6.3上的Microsoft Corporation Enterprise Edition(64位)(版本9600:)
DECLARE @currentDate DATE = '2016-5-25';

;WITH cte AS(
    SELECT dateadd(dd,1,eomonth(@currentDate,-1)) AS  fd
    UNION ALL
    SELECT DATEADD(DAY, 1, fd) 
    FROM cte
    WHERE fd < eomonth(@currentDate)
)
SELECT * FROM cte
;WITH e1(n) AS
(
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
), -- 10
e2(n) AS (SELECT 1 FROM e1 CROSS JOIN e1 AS b), -- 10*10
e3(n) AS (SELECT 1 FROM e1 CROSS JOIN e2), -- 10*100
tally as (SELECT id = ROW_NUMBER() OVER (ORDER BY n) FROM e3 )
select 
dateadd(DD,ID-1,dateadd(dd,1,eomonth(@currentDate,-1))) as Dates
from Tally
where dateadd(DD,ID-1,dateadd(dd,1,eomonth(@currentDate,-1)))<=eomonth(@currentDate)