2012-07-25 115 views
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) 

我只是不知道如何将两者结合在一起,这样我可以安排这个日常运行。

+1

你是否每天创建表?听起来像不好的设计问题。你认为重新设计? – triclosan 2012-07-25 12:25:04

+0

这是sql-server?构建客户端时,这会更简单,如何/从您运行SQL的方式? – 2012-07-25 12:25:23

+0

是的,每天都有一张桌子......不是我的设计,而是需要数千台机器向这些桌子报告数据。另外,它使得在一周后归档和删除表格变得更加容易。 – DamianS 2012-07-25 13:06:40

回答

0

,你可以做到这一点使用动态查询。尽管使用动态查询并不是一个好习惯。但我想这是在这里

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

exec(' 
SELECT m.displayName,a.source,count(a.agentGuid) from ntEventLog'[email protected]_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') 

唯一的选择,因为在评论中提及了三氯生,你应该考虑重新设计表格。不是一个很好的做法,表制定的每日

+0

这是完美的!非常感谢你! – DamianS 2012-07-25 13:02:36

0

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

请尝试这样的:

declare @var nvarchar(max) 
set @var ='select * From '+convert(varchar,getDate(),112) 
exec (@var) 
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 '[email protected]+' 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