我有几个包含常用表名的表。我想从中选择所有数据而不指定所有表并将它们联合起来。我正在考虑使用information_schema.tables来实现这一目标。
表:
查询:
SELECT *
FROM (
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'tbl_201602%'
) a
但是,此查询仅返回表名,而不返回表中的数据。我需要联合查询中包含的所有表。谢谢。
答案 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表具有相同的列数和相同的顺序,否则可能会引发错误