0

对不起任何不正确的术语,因为我不精通 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)

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

4

3 回答 3

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')

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

于 2012-07-25T12:29:46.050 回答
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 帖子 www.sommarskog.se/dynamic_sql

于 2012-07-25T12:30:50.950 回答
0

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

请尝试:

declare @var nvarchar(max)
set @var ='select * From '+convert(varchar,getDate(),112)
exec (@var)
于 2012-07-25T12:28:34.723 回答