表名包括日期

时间:2012-07-25 12:21:47

标签: sql

对于任何不正确的条款表示不满,因为我不熟悉SQL ...

我有一个我需要每天运行的查询,但是我需要查询的表包含今天的日期。通常我会跑:

SELECT m.displayName, a.source, count(a.agentGuid)
FROM ntEventLog20120725 AS a
LEFT OUTER JOIN machNameTab AS m ON a.agentGuid = m.agentGuid
WHERE a.eventTime > DATEADD(hour, -1, CURRENT_TIMESTAMP)
GROUP BY a.agentGuid, m.displayName, a.source
HAVING COUNT(a.agentGuid) > 1000
ORDER BY m.displayName

然而,我想每天查询的表格是不同的。今天的表是ntEventLog20120725,明天将是ntEventLog20120726。我知道如何以这种格式获取日期:

SELECT CONVERT(varchar, getDate(), 112)

我只是不知道如何将两者结合在一起,以便我可以安排每天运行。

3 个答案:

答案 0 :(得分:0)

一种方法是构建查询并执行。

请尝试:

declare @var nvarchar(max)
set @var ='select * From '+convert(varchar,getDate(),112)
exec (@var)

答案 1 :(得分:0)

您可以使用动态查询执行此操作。虽然使用动态查询不是一个好习惯。但我想这是唯一的选择

declare @date_val char(8)
select @date_val=convert(varchar,getDate(),112)

exec('
SELECT m.displayName,a.source,count(a.agentGuid) from ntEventLog'+@date_val+' a LEFT OUTER JOIN machNameTab m ON a.agentGuid = m.agentGuid WHERE a.eventTime > DATEADD(hour, -1, CURRENT_TIMESTAMP)
GROUP BY a.agentGuid, m.displayName,a.source
HAVING COUNT(a.agentGuid) > 1000
ORDER BY m.displayName')

作为评论中提到的三氯生,您应该考虑重新设计表格。每天都有桌子不是一个好习惯

答案 2 :(得分:0)

如果无法更改设计,唯一的方法是使用动态sql

declare @table varchar(100), @sql varchar(8000)
set @table='ntEventLog'++convert(varchar,getDate(),112)
set @sql='
SELECT 
    m.displayName,a.source,count(a.agentGuid) 
from '+@table+' a 
    LEFT OUTER JOIN machNameTab m ON a.agentGuid = m.agentGuid 
WHERE 
    a.eventTime > DATEADD(hour, -1, CURRENT_TIMESTAMP) 
GROUP BY 
    a.agentGuid, m.displayName,a.source 
    HAVING COUNT(a.agentGuid) > 1000 
ORDER BY m.displayName'
exec(@sql)

另请务必阅读thios post www.sommarskog.se/dynamic_sql