创建 SQL 全局温度 Table,同时在日期范围之间动态旋转年份作为列

Create SQL Global Temp Table while Dynamically Pivoting Years between a Date Range as Columns

我如何更改下面的手动 DDL 脚本以动态创建 table?例如,我想为 2017 年和当前年份(2021 年)之间的每一年创建 2 列(注册年份和退出年份)并旋转它们。目前,该脚本将手动创建从 2017 年到 2021 年的列。我应该采取什么方向来使其动态化?

我正在考虑使用 while 循环来完成此操作,但我不太确定我是否在正确的轨道上或者是否有更好的方法。明年 2022 年,当脚本为 运行 时,它应该附加 [2022] 列。明年 2023 年脚本应附加 [2023] 列等。

DROP TABLE IF EXISTS ##Enrollment

CREATE TABLE ##Enrollment
(
    [ID]                      VARCHAR(10), 
    [First_Name]              VARCHAR(255) NULL ,
    [Middle_Name]             VARCHAR(255) NULL,
    [Last_Name]               VARCHAR(255) NULL,
    [Date_of_Birth]           DATE NULL,
    [2017_Enrollment_Date]    DATE NULL,
    [2017_Disenrollment_Date] DATE NULL,
    [2018_Enrollment_Date]    DATE NULL,
    [2018_Disenrollment_Date] DATE NULL,
    [2019_Enrollment_Date]    DATE NULL,
    [2019_Disenrollment_Date] DATE NULL,
    [2020_Enrollment_Date]    DATE NULL,
    [2020_Disenrollment_Date] DATE NULL,
    [2021_Enrollment_Date]    DATE NULL,
    [2021_Disenrollment_Date] DATE NULL,
    [Begin_Date]              DATE NULL,
    [End_Date]                DATE NULL
)

一种方法是在最大值和最小值之间迭代数年,然后迭代动态列的 2 个可能名称

declare @minyear int = 2017
declare @maxyear int
declare @ddl varchar(max)
declare @i int = 0

if (@maxyear is null) select @maxyear=year(getdate())

drop table if exists ##Enrollment

set @ddl = 
'CREATE TABLE ##Enrollment(
 [ID]                           VARCHAR(10)
,[First_Name]                   VARCHAR (255) NULL 
,[Middle_Name]                  VARCHAR (255) NULL
,[Last_Name]                    VARCHAR (255) NULL
,[Date_of_Birth]                DATE NULL
,[Begin_Date]                   DATE NULL
,[End_Date]                     DATE NULL'

while @maxyear >= @minyear
begin    
  while @i <= 1
  begin 
    set @ddl = @ddl + char(13) + 
      ',[' + cast(@minyear as varchar(4)) + '_' + case when @i = 0 then 'En' else 'Disen' end + 'rollment_Date] DATE NULL'
    set @i = @i + 1
  end
    
  set @minyear = @minyear + 1
  set @i = 0
end 

set @ddl = @ddl + char(13) + ')'

exec (@ddl)

如果您将值设置为 @maxyear(例如在声明中,使用 declare @maxyear int = 2023),您可以检查列达到 2023 年。

你可以测试这个db<>fiddle