2014-09-03 57 views
3

我需要在30天內從一組表中檢索結果。動態表名稱上的表連接

該數據庫似乎創建了名爲monitorCounterLog的新表,並在結尾處顯示日期,然後刪除30天以外的任何內容。

EG: dbo.monitorCounterLog20140903用於當天在我所在位置的日期。然後將這些日期向後重複30天。

EG: 
dbo.monitorCounterLog20140903 
dbo.monitorCounterLog20140902 
dbo.monitorCounterLog20140901 
dbo.monitorCounterLog20140831 
dbo.monitorCounterLog20140830 

等等......

我需要實現類似於以下:

SELECT * 

    FROM monjtorCounterLog[30_days_worth_of_table_dates] ml 
     INNER 
     JOIN machNameTab mn 
     ON mn.agentGuid = ml.agentGuid 

WHERE [stuff...] 

這跨越30桌需要工會的所有數據。

我得到了一些動態SQL(沒有這方面的經驗),但是我不知道如何根據需要將它加入到其他表中。

DECLARE @mCounterLog NVARCHAR(MAX) 

    SELECT @mCounterLog = STUFF((SELECT ' UNION ALL SELECT * FROM ' +st.name AS [text()] 

     FROM sys.tables st 

    WHERE (st.name LIKE 'monitorCounterLog[0-9]%' OR st.name = 'monitorCounterLog') 
     FOR XML PATH('')), 1, 11, ''); 

     EXEC sp_executesql @mCounterLog 

我可以在這裏做些什麼來實現動態SQL所需的連接?

將動態SQL插入臨時表中,然後加入結果,還是有更好的方法來解決這個問題?

使用正確的語法丟失很少。

回答

3

在你的代碼的@mCounterLog變量將包含此:

SELECT * FROM monitorCounterLog20140903 
UNION ALL 
SELECT * FROM monitorCounterLog20140902 
UNION ALL 
SELECT * FROM monitorCounterLog20140901 
UNION ALL 
SELECT * FROM monitorCounterLog20140831 
etc. 

(爲便於閱讀,我已經插入換行符你的代碼生成一個班輪)

因此,與其他加入吧表做到這一點傳遞變量之前sp_execute:

SET @mCounterLog = N'SELECT * FROM (' + @mCounterLog 
SET @mCounterLog = @mCounterLog + N') ml INNER JOIN achNameTab mn 
      ON mn.agentGuid = ml.agentGuid 
      WHERE [stuff...]' 
EXEC sp_executesql @mCounterLog 

基本上你大UNION ALL查詢變成一個子查詢爲您ml別名

+0

太棒了,謝謝!這就是我需要的。 – Jason 2014-09-03 05:58:43