2015-07-11 2 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

Сколько таблицы у вас есть? Когда я столкнулся с подобной ситуацией, я использовал операции объединения, а затем вставил этот запрос в новую таблицу. В моем случае два новых столбца были столбцом идентификации и вычисленным столбцом. –

ответ

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 - автоинкремент, используемый для циклизации. Looping имеет лучшую производительность и более простой синтаксис, чем курсор. –

+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]

Смежные вопросы