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)

毎日実行するようにスケジュールできるように、2つを組み合わせる方法がわかりません。

4

3 に答える 3

0

1つの方法は、クエリを作成して実行することです。

次のようにしてみてください:

declare @var nvarchar(max)
set @var ='select * From '+convert(varchar,getDate(),112)
exec (@var)
于 2012-07-25T12:28:34.723 に答える
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)

また、www.sommarskog.se/dynamic_sqlの投稿を必ず読んでください。

于 2012-07-25T12:30:50.950 に答える