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 行和 运行 脚本的注释。
我有一个 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 行和 运行 脚本的注释。