SQL Выбор таблиц с названиями месяцев из диапазона дат - PullRequest
1 голос
/ 14 января 2012

У меня есть таблицы с именами:

Posts_August_2011
Posts_September_2011
Posts_October_2011
Posts_November_2011
Posts_December_2011
Posts_January_2012

Я хочу создать хранимую процедуру, которая будет UNION таблиц, но это не проблема, поскольку я могу использовать динамический SQL, чтобы склеить ее, моя проблема состоит в том, чтобы получить диапазон месяцев и годов от RANGE до какого-то списка? а затем проверяем, существует ли таблица, объединяем их и возвращаем.

Я бы объявил 2 переменные @FromDate и @Todate as datetime

Как лучше всего извлечь название месяца и год для каждого из месяцев в указанном диапазоне.

Скажите, я задаю диапазон @FromDate = '2011-10-18 14:16:27.000' and @ToDate = '2012-01-09 14:16:27.000' Может кто-нибудь посоветовать, как извлечь Месяц и год.

DECLARE @SqlToExecute as nvarchar(MAX);

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

@SqlToExecute += 'SELECT * FROM Posts_' + extractedMonthName + '_' + extractedYear + ' UNION ALL ';

Ответы [ 3 ]

2 голосов
/ 14 января 2012

Эта проблема вызвана плохим дизайном базы данных. Вам нужно было хранить строки из всех этих таблиц в одной таблице Posts с полем date для указания месяца и года.

Чтобы получить имена таблиц Posts_% и даты, извлеченные из их имен, вы можете использовать следующий код:

create table Posts_August_2011(i int)
GO
create table Posts_September_2011(i int)
GO

DECLARE @SqlToExecute varchar(max)
DECLARE @FromDate date = '20110801', @ToDate date = '20110809'

SELECT  name PostName, CAST(REPLACE(REPLACE(name,'Posts_','01/'),'_','/') as date) PostDate
INTO #Posts
FROM sys.tables
WHERE name like 'Posts_%'

SET @SqlToExecute=''

SELECT @SqlToExecute += 'SELECT * FROM ' + PostName + ' UNION ALL '
FROM #Posts
WHERE PostDate>=@FromDate
      AND PostDate<@ToDate

SELECT SUBSTRING(@SqlToExecute,1, LEN(@SqlToExecute)-10)

DROP TABLE #Posts
DROP TABLE Posts_August_2011
DROP TABLE Posts_September_2011

SYS. таблицы - представление системного каталога, которое возвращает строку для каждого объекта таблицы в текущей базе данных.

0 голосов
/ 14 января 2012

Можно ли поместить их в одну таблицу [Post] с датой публикации?И разделить их, если нужно?

0 голосов
/ 14 января 2012

Вы можете использовать DATENAME(month,date) и YEAR(date) для построения своих наборов месяцев и лет.

Самый простой способ - создать крошечный справочный файл с комбинациями года / месяца и отфильтровать диапазон дат, а затем простоЗациклите результаты, создайте запрос и выполните.

Позже вы можете разбить эту таблицу на месячные разделы, если размер таблиц - то, что заставляет их разбивать их таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...