SQL Feed查询结果为Union All Statement

时间:2017-03-23 05:03:13

标签: sql sql-server reporting-services sql-server-2012 union-all

我有一个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

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

1 个答案:

答案 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行并运行脚本。