Sql 使用Union All动态组合查询

Sql 使用Union All动态组合查询,sql,sql-server,Sql,Sql Server,我有三张桌子: Table A Table B Table C ______________ ______________ ______________ | Order | Year | | Order | Year | | Order | Year | +--------------+ +----------

我有三张桌子:

    Table A                  Table B                     Table C
 ______________            ______________             ______________
| Order | Year |          | Order | Year |           | Order | Year | 
+--------------+          +--------------+           +--------------+
| O1-17 | 2017 |          | O1-18 | 2018 |           | O1-19 | 2019 |
+--------------+          +--------------+           +--------------+
我使用
UNION-ALL
组合了这些表

SELECT Order,Year FROM [Table A]
UNION ALL
SELECT Order,Year FROM [Table B]
UNION ALL
SELECT Order,Year FROM [Table C]
我的问题是,每年都要添加一个新表。一个例子是表D,其中包含相应的记录顺序
O1-20
和年份
2020
。除了添加另一组
UNION ALL
,还有其他方法可以实现相同的结果


我正在使用它来生成报告。

我可以想到三个选项:

1) 每年在查询中手动更新union-虽然不理想,但可能比选项2更好

2) 使用动态SQL生成查询,它可以根据查询的运行日期自动生成查询。它有点丑陋的想法和表现可能不是很好

3) 这是我的首选选项,运行一个定期维护任务,在一个数据库中填充一个完全独立的表,其中只包含报表所需的数据


选项2可能看起来像:

declare @StartYear int = 2015, @EndYear int = datepart(year, getdate()), @sql nvarchar(max) = '', @Index int;
set @Index = @StartYear;

declare @Years table ([Name] varchar(128));

while @Index <= @EndYear begin
  insert into @Years ([Name])
    select 'BaseTableName' + convert(varchar, @Index);
  set @Index = @Index+1;
end

select @sql = @sql + case when len(@sql) > 0 then ' union all ' else '' end + 'select [Order], [Year] from ' + [Name]
from @Years

select @sql
--exec(@sql)
声明@StartYear int=2015,@EndYear int=datepart(year,getdate()),@sql nvarchar(max)='',@Index int;
设置@Index=@StartYear;
声明@Years表([Name]varchar(128));
当@Index 0然后“union all”其他“end+”时,从“+[Name]中选择[Order],[Year]
从@年开始
选择@sql
--exec(@sql)

DynamicSQL和游标,我曾在类似的新表上工作过“,无法删除,因此我可能会完成注释…您可以在未来20年内创建空的新表/数据库,只需在某个地方输入一个错误,即2038请创建新表!”!如果您使用动态sql,只需将普通sql构建为字符串,然后执行即可: