2015-07-11 41 views
0

我有很多表都具有相同的结构和类似的表名称,并且正在寻找一种方法来将它们中的几列全部合并到一个具有两个额外列的新表中:一个自动生成的整数PK,以及源表。例如,如何合并很多类似的表格?

的UniqueID的SourceID,XCOORD,YCOORD,Zcoord,sourceTable会

我设法创建一个包含所有我想要使用的表的列表的表,但不知道下一步该怎么做。

SELECT [name] 
INTO PointTables 
FROM [Surveys].[sys].[tables] 
where [name] like '%CoordDB' 
+0

您是通过使用SYS.TABLES获取表名,但有关柱用什么SYS.COLUMNS加入 – mohan111

+0

多少你有桌子吗?当我遇到类似的情况时,我使用联合操作,然后将该查询插入到新表中。在我的情况下,两个新列是一个标识列和一个计算列。 – 2015-07-11 04:01:30

回答

0

不是很清楚这个问题。 这些表的列名是否相同? 你想插入到PointTables?

您可以创建表:

create table PointTables(
UniqueID int identity 
, Xcoord int 
, Ycoord int 
, Zcoord int 
, SourceTable varchar(50) 

之后,你可以插入表sp_executesql的命令的帮助和串联

declare @command nvarchar(max) 
select @command = 'insert into PointTables(Xcoord,YCoord,ZCoord,SourceTable) 
select [Xcoord],[YCoord],[Zcoord],'''+name+''' from '+name from sys.tables where name like '%CoordDB%' 
execute sp_executesql @command 
+0

谢谢 - 这让我关闭,但只抓住它找到的第一个表中的数据。在四处搜寻后,我发现提及了游标,但不知道如何使用它们。 –

+0

嗯,实际上你可以用循环做一些解决方法。创建一个包含2列的表:id和tablename。 Id列是自动增量,用于循环。循环比游标具有更好的性能和更简单的语法。 –

+0

谢谢。当我开始处理真实数据时,性能将成为问题,所以我会在下一轮尝试。 –

0

从查理·卢克曼答案是一个良好的开端,但对于一些原因只在第一张桌子上工作。我查看了其他几篇文章,并发现了一些游标,这些游标允许您使用WHILE循环一次构建/连接多个INSERT INTO命令,从而一次处理一行代码。虽然这在我对5张桌子的测试中有效,但当我达到100张或1000张桌子时,我担心的是性能。

declare @command nvarchar(max) 
declare @tblname varchar(50) 
declare TableCursor Cursor 
    FOR SELECT name FROM sys.tables where name like '%%DB_COORD' 
SET @command = '' 
OPEN TableCursor 
    FETCH NEXT FROM TableCursor INTO @tblname 

    WHILE @@FETCH_STATUS <> -1 
    BEGIN 
     select @command = @command + 'INSERT into MasterPoints(SourceID, Xcoord, Ycoord, Zcoord, PtCode, SourceTable) SELECT UPTNUM, EAST, NORTH, ELEVATION, CODE,''' + @tblname + '''from "' + @tblname + '" ' 
     FETCH NEXT FROM TableCursor INTO @tblname 
    END 
CLOSE TableCursor 
DEALLOCATE TableCursor 

execute sp_executesql @command 

SELECT DISTINCT [sourceTable会] FROM [歧管] [DBO]。[MasterPoints]