2016-12-29 3 views
0

У меня есть большое количество таблиц (несколько тысяч), содержащих похожие данные. Я хотел бы запустить некоторые отчеты из них. Имена таблиц аналогичны, поэтому я могу получить список имен таблиц.SQL-UNION ВСЕ большое количество таблиц

Я, скорее всего, объединил эти таблицы в будущем, должен быть тривиальным после того, как работает выбор.

--Getting a list of all tables 
select TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'TableNamePrefix%' 
ORDER BY TABLE_NAME 

Чтобы объединить данные, я могу использовать UNION ALL, но не уверен, о том, как настроить WHILE/курсор так, чтобы список не должен постоянно обновляться.

Что-то вроде

SELECT * FROM TableNamePrefix00001 
UNION ALL 
SELECT * FROM TableNamePrefix00002 
UNION ALL 
SELECT * FROM TableNamePrefix00003 
--And so on for all tables in the list 

Любая помощь приветствуется, спасибо.

+0

Использование динамического SQL – xQbert

+0

Слейте их сначала. –

ответ

0

используя свой рисунок на имя таблицы - я получил где-то с

DECLARE @SQL nvarchar(max); 

select @SQL = COALESCE(@SQL , '') + 'SELECT * FROM [' + TABLE_NAME + '] UNION ALL ' 
FROM INFORMATION_SCHEMA.TABLES where TABLE_NAME LIKE '%employeedet%'; 

SELECT @SQL = LEFT(@SQL, LEN(@SQL) - 11); 

print @SQL; 
+0

Измените строку SELECT на нижеследующее, чтобы избежать конечного UNION ALL: 'select @SQL = COALESCE (@SQL + 'UNION ALL', '') + 'SELECT * FROM [' + TABLE_NAME + ']'' –

+0

Я закончил используя этот, с EXEC, а не с печатью из-за ограничения по характеру. Некоторые из других комментариев также были бы точными решениями. – OwlsSleeping

0

Все эти таблицы имеют одинаковые типы данных и количество столбцов, потому что если это не так, то вы не сможете использовать предложения UNION, однако очень странно объединить всю информацию таким образом, не могли бы вы Приведите несколько примеров, чтобы прояснить это.

+0

в предположении, что была разработана конструкция, в которой данные определенной категории были удалены в таблицы только для этих данных, например. AccountsJan2000, AccountsFeb2000, ... Я видел, что это делалось раньше - следовательно, «я, скорее всего, буду объединять эти таблицы в будущем» – Cato

+0

Да, в этом случае. Многие таблицы со схожими данными, где одна таблица выполнила бы эту работу. – OwlsSleeping

5

Вы можете сделать это с помощью Dynamic SQL

Declare @SQL varchar(max) ='' 
Select @SQL = @SQL +'Union All Select * From '+Table_Name+' ' 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_NAME LIKE 'TableNamePrefix%' 
    ORDER BY TABLE_NAME 
Set @SQL = Stuff(@SQL,1,10,'') 
Exec(@SQL) 
1
select 'select * from '+TABLE_NAME +' union all' 
FROM 
INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '%chd%' 
ORDER BY TABLE_NAME 

Отменить последнее объединение всех

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