@Jozo

Как сформировать запрос в MSSQL на вывод из нескольких таблиц?

Нужно вывести данные из всех таблиц имеющие вид:
very_strong_table_20170109
very_strong_table_20170209
very_strong_table_20170308
very_strong_table_20170407
very_strong_table_20170506

Таблица very_strong_table_******** создается каждый месяц (30 дней). Структура у них одинаковая.
Буду рад любым советам, спасибо!
  • Вопрос задан
  • 78 просмотров
Решения вопроса 1
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
Использовать UNION, запрос формировать динамически.
Список таблиц:
SELECT name FROM sysobjects WHERE name like 'very_strong_table_%' AND type = 'U'

На его основе формируйте запрос.
как можно используя юнион сформировать такой запрос?

Так как вас учили. Я бы использовал курсор, я к ним привык.
Например
DECLARE @TAB VARCHAR(500), @SQL VARCHAR(1000)
  SET @SQL = '--'
  DECLARE LISTTABLEE CURSOR LOCAL FAST_FORWARD FOR
    SELECT name FROM sysobjects WHERE name like 'very_strong_table_%' AND type = 'U'
  OPEN LISTTABLEE
  FETCH LISTTABLEE INTO @TAB
  WHILE @@FETCH_STATUS = 0 BEGIN
    SET @SQL = @SQL + CHAR(13)+CHAR(10)+'SELECT * FROM '+ @TAB
    FETCH LISTTABLEE INTO @TAB
    IF @@FETCH_STATUS = 0 
      SET @SQL = @SQL + CHAR(13)+CHAR(10)+'UNION'
  END
  CLOSE LISTTABLEE
  DEALLOCATE LISTTABLEE
  PRINT @SQL
  EXECUTE(@SQL)
docs.microsoft.com

Замечание: использовать множество таблиц вместо одной — очень большая ошибка. Тем более если таблицы имеют одинаковые параметры, например, находятся в одном файле.
К сожалению, архитектуру делал не я, а вендор решения.

Тут возможно несколько решений. Например, сделать представление содержащее UNION из списка таблиц. Или создать самому одну таблицу, а приложению подсовывать синонимы.
CREATE SYNONYM  [dbo].[very_strong_table_20170109] FOR [dbo].[very_strong_table_all]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы