Выберите данные из нескольких таблиц с одинаковыми именами столбцов и структурой, используя sql - PullRequest
0 голосов
/ 19 февраля 2020

Я получаю данные из сторонней базы данных для генерации определенных отчетов. Проблема заключается в том, что он продолжает генерировать новую таблицу каждый месяц для вставки одной и той же записи в одни и те же столбцы следующим образом:

For December table : Data_12_2019
For January table  : Data_1_2020
For February table : Data_2_2020
For March table    : Data_3_2020 and so on

, а данные таблицы выглядят следующим образом:

UserId  DLogId  LogDate
1461    1799    2020-01-06 09:07:51.000
1462    1803    2020-01-07 09:29:39.000
1463    1806    2020-01-07 11:43:11.000
1464    1807    2020-01-09 09:16:47.000
1457    1819    2020-01-10 09:00:56.000

table2

UserId  DLogId  LogDate
1466    1853    2020-02-03 09:11:54.000
1468    1831    2020-02-04 09:17:09.000
1470    1833    2020-02-5 09:01:06.000

и нуждаются в выводе в одну таблицу следующим образом:

UserId  DLogId  LogDate
1461    1799    2020-01-06 09:07:51.000
1462    1803    2020-01-07 09:29:39.000
1463    1806    2020-01-07 11:43:11.000
1464    1807    2020-01-09 09:16:47.000
1457    1819    2020-01-10 09:00:56.000
1466    1853    2020-02-03 09:11:54.000
1468    1831    2020-02-04 09:17:09.000
1470    1833    2020-02-5 09:01:06.000

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

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

Этого можно добиться с помощью динамического запроса c. Если ваша структура таблицы такая же, вы можете попробовать следующее:

DECLARE @query AS NVARCHAR(max) = Stuff((SELECT DISTINCT ' ' + 'SELECT * FROM ' + Quotename(name) + ' UNION' 
                 FROM   
                 (
                  SELECT 
                    [name]
                FROM
                    sys.sysobjects
                WHERE
                    [xtype] = 'U'
                    and NAME LIKE 'Data_[0-9][0-9]_[0-9][0-9][0-9][0-9]'
                 )t
                 FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, ''); 

SET @query= substring(@query,0,len(@query)-5)
exec(@query)

Примечание : лучше заменить * на имена нужных вам столбцов.

Чтобы получить все таблицы, которые вы можете использовать sysobject и отфильтровать на основе имен таблиц, таких как

SELECT [name]
FROM sys.sysobjects
WHERE [xtype] = 'U'
    AND NAME LIKE 'Data_[0-9][0-9]_[0-9][0-9][0-9][0-9]'

и построить динамический запрос c, используя UNION.

0 голосов
/ 19 февраля 2020
PREPARE stmt1 FROM ' SELECT GROUP_CONCAT('SELECT * FROM ',TABLE_NAME,' UNION ')
FROM information_schema.tables
WHERE table_schema =? AND table_name LIKE 'Data_%'';

SET @a = 'MyDb';

EXECUTE stmt1 USING @a;
...