SQL 源查询结果将结果合并到“全部联合”语句中



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

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

现在,我正在寻找一种方法来让查询调用选择以聚合数据的每个表。 这将用于 SSRS 报告。

像这样的东西,其中表1,表

2等通过所有包含的表将被填充(无论是4,5还是更多(:

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

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

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

不需要创建新的或临时的表来执行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 行并运行脚本。

最新更新