我需要在SQL Server 2012环境中基于2个参数创建临时表或公用表表达式
@calYear @currentYear
因此,如果 @calYear = 5和 @currentYear='2014' 我想从当前年份生成5年的临时表,其中包含4列,例如
@calYear = 5
@currentYear='2014'
YearDesc MonthName MonthNum FirstDayOfMonth 2014 Jan 1 1/1/2014 2014 Feb 2 2/1/2014 2014 Mar 3 3/1/2014 ... ... ... 2018 Oct 10 10/1/2018 2018 Nov 11 11/1/2018 2018 Dec 12 12/1/2018
是否可以有效地执行“做而做”循环?我该如何计算月份名称?我正在使用一个非常麻烦的Do While循环对一年中的所有月份进行迭代,然后对所有年份进行迭代。
使用递归CTE的一种方法:
declare @calYear int = 5, @currentYear char(4) = '2014' ;with cte (dt) as ( select DATEFROMPARTS(@currentyear,1,1) dt union all select dateadd(month,1,dt) from cte where dt < dateadd(year,@calyear,DATEFROMPARTS(@currentyear,1,1)) ) select year(dt) YearDesc, datename(month, dt) MonthName, month(dt) MonthNum, dt FirstDayOfMonth from cte order by dt
或使用数字表:(在这种情况下为master..spt_values)
declare @calYear int = 5, @currentYear char(4) = '2014' ;with cte2 (dt) as ( select dateadd(month,number,DATEFROMPARTS(@currentyear,1,1)) dt from master..spt_values where type = 'p' and number <= 12*@calYear ) select year(dt) YearDesc, datename(month, dt) MonthName, month(dt) MonthNum, dt FirstDayOfMonth from cte2 order by dt