查询根据年和月更改名称的表

时间:2015-12-16 14:13:03

标签: sql sql-server

我们的机构拥有200多辆消防车和50辆救护车。这些设备中的每一个都具有板载gps,用于将数据注册到SQL Server 2012数据库中。每个月都有数百万条数据记录。每个月表的名称都会发生变化。例如;本月(2015年12月16日),该表的名称为GPS.dbo.History201512,并且仅保存2015年12月的gps数据。下个月(2016年1月),名称应为GPS.dbo.History201601它将保留2016年1月的数据。因此模式为GPS.dbo.HistoryYYYYMM。 一个简单的查询是:

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

所以这是一个移动的目标。该表更改了可预测模式的名称。 我该怎么办?我可以对此查询进行编程以查询当前月份。如果今天的日期是2016年7月4日,则查询表格GPS.dbo.History201607。如果今天的日期是2017年11月9日,则查询表格GPS.dbo.History201711

如何对查询进行编程,使其获取系统日历日期,然后查询相应的月度表?

3 个答案:

答案 0 :(得分:1)

对Peter_James的回答略有改善:

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

答案 1 :(得分:0)

创建传递YYYYMM作为参数的存储过程将是您最好的选择。

可替换地:

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

答案 2 :(得分: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

这需要手动维护

如果在表中放入适当的检查约束,并使用适当的where子句,优化器将足够聪明,只能查看正确的表

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

您应该分析您获得的查询类型。您可能可以执行其他操作,例如使用多维数据集