如何创建SQL过程以从不断增长的表列表中合并表

时间:2019-07-11 18:03:42

标签: sql-server

我需要将来自多个表的信息合并到一个表中。问题在于正在创建新表,除了名称的开头部分之外,我无法控制它们的创建时间或名称。

如果可以的话,我会喜欢的:

Select t.name
into #aReading
from sys.tables as t
where t.name like 'Fast_a%'

Select *
from (Select name from #aReading)

这可行,但是不断需要添加新表

Insert (col1, col2) into TestTable

Select x.* from (col1,col2
from test1

union

Select col1,col2
from test1_01022019

union
Select col1,col2
from test1_09122019 ) x 

我仍在学习SQL,但对While的使用不是很好,但我认为这可能是答案。

1 个答案:

答案 0 :(得分:1)

这是一个动态SQL示例(例如,将查询构建为字符串,然后使用内置过程sp_executesql执行查询)。

此示例使用STUFF and FOR XML PATH('')将一堆查询连接在一起,并在每个查询之间添加“ UNION”。

DECLARE @sql NVARCHAR(MAX) = 'INSERT INTO TestTable (col1, col2) '

SELECT @sql += STUFF(
    (SELECT ' UNION SELECT col1, col2 FROM ' + t.name
    FROM sys.tables as t
    WHERE t.name like 'Fast_a%'
    FOR XML PATH('')), 1, 7, '')

EXEC sp_executesql @sql

因此,对于此架构:

CREATE TABLE fast_a1 (col1 INT, col2 INT)
CREATE TABLE fast_a2 (col1 INT, col2 INT)
CREATE TABLE fast_aasdf (col1 INT, col2 INT)
CREATE TABLE TestTable (col1 INT, col2 INT)

它将构建此动态查询:

INSERT INTO TestTable (col1, col2) 
SELECT col1, col2 FROM fast_a1 
UNION 
SELECT col1, col2 FROM fast_a2 
UNION 
SELECT col1, col2 FROM fast_aasdf

编辑:

Liz,依次运行这些语句(or here's a SQL fiddle),您会发现它们确实插入了数据:

CREATE TABLE fast_a1 (col1 INT, col2 INT);
CREATE TABLE fast_a2 (col1 INT, col2 INT);
CREATE TABLE fast_aasdf (col1 INT, col2 INT);
CREATE TABLE TestTable (col1 INT, col2 INT);

INSERT INTO dbo.fast_a1 VALUES (1, 1);
INSERT INTO dbo.fast_a2 VALUES (2, 2);
INSERT INTO dbo.fast_aasdf VALUES (3, 3);

DECLARE @sql NVARCHAR(MAX) = 'INSERT INTO TestTable (col1, col2) '

SELECT @sql += STUFF(
    (SELECT ' UNION SELECT col1, col2 FROM ' + t.name
    FROM sys.tables as t
    WHERE t.name like 'Fast_a%'
    FOR XML PATH('')), 1, 7, '')

EXEC sp_executesql @sql

SELECT * FROM dbo.TestTable

返回:

col1    col2
1       1
2       2
3       3