我们的机构拥有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
。
如何对查询进行编程,使其获取系统日历日期,然后查询相应的月度表?
答案 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
您应该分析您获得的查询类型。您可能可以执行其他操作,例如使用多维数据集