如何从生成的信息模式表中选择数据

时间:2016-05-20 05:56:14

标签: sql-server

我有几个包含常用表名的表。我想从中选择所有数据而不指定所有表并将它们联合起来。我正在考虑使用information_schema.tables来实现这一目标。

表:

  • tbl_20160201
  • tbl_20160202
  • tbl_20160203
  • tbl_20160204
  • tbl_20160205

查询:

SELECT *
FROM (
    SELECT *
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME LIKE 'tbl_201602%'
) a

但是,此查询仅返回表名,而不返回表中的数据。我需要联合查询中包含的所有表。谢谢。

2 个答案:

答案 0 :(得分:2)

假设这些表具有相同数量的列和数据类型,您可以使用动态sql:

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql = @sql +
'SELECT * FROM ' + TABLE_NAME + ' UNION ALL' + CHAR(10)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'tbl_201602%';

SELECT @sql = SUBSTRING(@sql,1, LEN(@sql) - 11);

PRINT(@sql)
EXEC (@sql)

否则,您将收到错误消息:

  

使用UNION,INTERSECT或EXCEPT运算符组合的所有查询都必须   在目标列表中有相同数量的表达式

答案 1 :(得分:1)

以下查询可能会对您有所帮助: -

DECLARE @SQL VARCHAR(max) 
DECLARE @T as sysname 

-- Make sure below temporary table structure same as the tables e.g tbl_201602 which you want to union

declare @TT as Table(     
Col1 [decimal](18, 2) NOT NULL,
Col2 [date] NOT NULL,
Col3 [varchar](200) NOT NULL
)

DECLARE TName CURSOR FORWARD_ONLY STATIC FOR  
select TABLE_NAME 
from 
information_schema.tables where TABLE_NAME like 'tbl_201602%'

OPEN TName  
FETCH NEXT FROM TName INTO @T 
WHILE @@FETCH_STATUS = 0  
BEGIN
   SELECT @SQL = 'select * from' + ' ' + @T    
   INSERT INTO @TT
   EXEC(@SQL)
 FETCH NEXT FROM TName INTO @T   
END  

CLOSE TName  
DEALLOCATE TName

select * from @TT 

这将在一个临时表@TT

中提供所有表的并集

注意:只需确保所有的comman表具有相同的列数和相同的顺序,否则可能会引发错误