我有一个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报告。
这样的事情,其中table1,table2等通过所有包含的表将被填充(无论是4,5还是更多):
SELECT *
FROM table1
UNION ALL
SELECT *
FROM table2
UNION ALL
...
ORDER BY EVENT_DATE DESC
我无法创建视图,新表或对现有表进行任何更改。
答案 0 :(得分:2)
糟糕的设计每次都会带来艰苦的工作,这一点也不例外。我现在猜测,为时已晚,无法放弃每个月反复创建相同表格的想法。
您不需要创建新的或临时的表来执行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行并运行脚本。