SQL 将查询结果馈送到 Union All 语句

SQL Feed Query results into Union All Statement

我有一个 COTS 应用程序数据库,它每周创建一个新的 table,它遵循特定的命名约定并且始终包含相同的列。我写了一个查询到 select 特定时间范围内的 tables:

DECLARE @today VARCHAR(8)
SET @today = CONVERT(VARCHAR(8),GETDATE(),112)

DECLARE @monthold VARCHAR(8)
SET @monthold = CONVERT(VARCHAR(8),dateadd(day,-31,@today),112)

SELECT name
FROM sys.tables
WHERE name <= 'Event_Audit'+ @today AND name >= 'Event_Audit'+ @monthold 
AND name like 'Event_Audit%'
ORDER BY name DESC

现在我正在寻找一种方法来对每个 table 进行查询调用 selected 以聚合数据。这将用于 SSRS 报告。

像这样的东西,其中 table1、table2 等通过所有包含的 tables 将被填充(无论是 4、5 还是更多):

SELECT *
FROM table1
UNION ALL
SELECT *
FROM table2
UNION ALL
...
ORDER BY EVENT_DATE DESC

我无法创建视图、新 table 或对现有 table 进行任何更改。

糟糕的设计每次都会导致艰苦的工作,这次也不例外。我猜现在放弃每个月一遍又一遍地创建相同的 table 的想法为时已晚。

您不需要创建新的或临时的 table 来执行 sp_executeSql,您只需要生成 sql 脚本:

DECLARE  @today char(8) = CONVERT(char(8),GETDATE(),112),
         @monthold char(8) = CONVERT(char(8),dateadd(day,-31,GETDATE()),112),
         @sql nvarchar(max) = ''



SELECT @Sql = @Sql + ' UNION ALL SELECT * FROM ' + name
FROM sys.tables
WHERE name <= 'Event_Audit'+ @today AND name >= 'Event_Audit'+ @monthold 
AND name like 'Event_Audit%'
ORDER BY name DESC

SET @SQL = STUFF(@SQL, 1, 11, '') + -- remove the first UNION ALL
    ' ORDER BY EVENT_DATE DESC' -- add the ORDER BY

PRINT @Sql
--EXEC sp_executeSql @Sql

打印完 @Sql 并检查它没问题后,取消对 EXEC 行和 运行 脚本的注释。