在Recursive 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
相反,可以使用符合表來做到這一點這是更好的方式性能相比Recursive 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)
哪個版本的SQL Server使用的是 –
的Microsoft SQL Server 2014 - 12.0.4213.0(X64) \t 2015年6月9日12時06分16秒 \t版權所有(C)在Windows NT微軟公司 \t企業版(64位)6.3(建設9600:) –
kamalpreet