2015-12-16 3 views
0

В нашем агентстве имеется более 200 пожарных машин и 50 машин скорой помощи. Каждое из этих устройств имеет GPS на борту, который регистрирует данные в базе данных SQL Server 2012. Каждый месяц это миллионы записей данных. Каждый месяц меняется имя таблицы. Например; В этом месяце (16 декабря 2015 года) имя таблицы составляет GPS.dbo.History201512, и оно будет хранить данные gps только в декабре месяце 2015 года. В следующем месяце (январь 2016 года) имя должно быть GPS.dbo.History201601, и оно будет содержать данные за январь 2016 года Таким образом, шаблон равен GPS.dbo.HistoryYYYYMM. Простой запрос будет:Запросить таблицу, которая меняет название на основе года и месяца

SELECT DateTimeStamp, Longitude, Latitude, Apparatus 
FROM GPS.dbo.History201512 
WHERE Apparatus = 'Ambulance32' 

Так что это движущаяся мишень. Таблица изменяет имена на предсказуемой структуре. Что я могу сделать, чтобы запросить этот запрос для текущего месяца. Если сегодняшняя дата - 4 июля 2016 года, тогда запросите таблицу GPS.dbo.History201607. Если сегодняшняя дата - 9 ноября 2017 года, тогда запросите таблицу GPS.dbo.History201711.

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

+1

Мне нужно знать, почему одна таблица не использовалась здесь. Эта колонка в одной таблице может содержать эту информацию. –

+0

См. Http://stackoverflow.com/questions/20678725/how-to-set-table-name-in-dynamic-sql-query –

+1

Почему бы не использовать только одну таблицу и индекс в дате или секционированную таблицу? –

ответ

0

Создание хранимой процедуры, передаваемой в YYYYMM в качестве параметра, будет вашим лучшим выбором.

В качестве альтернативы:

SET @TableName = 'GPS.dbo.History' + '201512' 
SET @SQLQuery = 'SELECT * FROM ' + @TableName 
EXEC @SQLQuery 
1

Небольшое улучшение Peter_James ответа:

SET @TableName = 'GPS.dbo.History' + CONVERT(CHAR(6), GETDATE(), 112) 
SET @SQLQuery = 'SELECT * FROM ' + @TableName + ' WHERE EmployeeID = @EmpID' 
EXEC @SQLQuery 
0

Вы можете создать разделенную вид связать их:

CREATE VIEW GPS.dbo.History 
AS 
SELECT COL1,COL2 FROM GPS.dbo.History201510 
UNION ALL 
SELECT COL1,COL2 FROM GPS.dbo.History201511 
UNION ALL 
SELECT COL1,COL2 FROM GPS.dbo.History201512 

Это необходимо поддерживать начинающийся вручную

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

https://technet.microsoft.com/en-au/library/ms190019(v=sql.105).aspx

Вы должны проанализировать типы запросов, которые вы получаете , Возможно, вы сможете делать другие вещи, такие как использование куба

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