0

我有多个表的表名以“事件”字尾结尾——如“TcpEvent”、“RdpEvent”、“WebEvent”等。表模式很少有常见的列,如“ID”、“名称”、“日期”。

是否有任何通用 SQL,以便我可以使用简单的 SINGLE 选择获取所有常用列内容?我尝试使用以下 SQL - 但它不起作用。

SELECT ID, Name FROM (SELECT TABLE_NAME FROM ( 
    SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS 
      WHERE TABLE_NAME LIKE '%Event') AS T) AS T;

任何帮助将不胜感激。

4

2 回答 2

1

根据这些表和它们共有的列创建一个视图:

create v_events as 
    select id, name, date, 'tcp' as eventtype from tcpEvent union all
    select id, name, date, 'rdp' as eventtype from rdpEvent union all
    select id, name, date, 'web' as eventtype from webEvent;

另一种方法是使用动态 SQL(通过preparestaetment)。拥有一个共同的观点可能是最简单、最可维护的方法。

于 2013-03-25T19:46:52.813 回答
1

您可以使用动态 SQL 来实现这一点,示例如下:(可能会给您提示)


declare @str varchar(max)
declare @str1 varchar(100)
set @str = 'select ID,Name from '
set @str1 = 'select ID,Name from '
select @str = @str +  TABLE_NAME + ' UNION ALL ' + @str1 FROM (SELECT Distinct TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS 
      WHERE TABLE_NAME LIKE '%Event') A
IF CHARINDEX('UNION ALL',@str, 0) > 0
    SET @str = SUBSTRING(@str,0, len(@str)-len('UNION ALL select ID,Name from '))
print @str
于 2013-03-25T20:19:16.813 回答