2017-01-30 41 views
2

我需要在服務器上的所有數據庫中查詢具有特定名稱的所有表。 數據庫每天由ISA創建,其名稱由掩碼生成ISALOG_ current_date _WEB_000。每個數據庫都包含表WebProxyLog。數據庫總數爲60. 我的目標是在所有數據庫或特定日期的數據庫中查詢WebProxyLog表。 喜歡的東西foreach循環:從具有特定名稱的所有數據庫中的所有表中選擇

foreach($db in $databases) 
{ 
    if($db.Name.Contains("_web")) 
    { 
    SELECT [ClientUserName],[logTime],[uri],[UrlDestHost],[bytesrecvd],[bytessent],[rule] 
    FROM [$db].[dbo].[WebProxyLog] 
    WHERE [ClientUserName] like ''%username%'' 
    } 
} 

完美的,如果查詢的結果將在單一的表或視圖合併。 有沒有辦法執行該操作?

回答

3

存在一個未記錄的存儲過程,名爲sp_MSForEachDB,但是,我不會急於使用未記錄的功能。這可以通過使用動態SQL即會從sys.DataBases系統表的數據庫名稱所做:

DECLARE @SQL nvarchar(max) = N'' 


SELECT @SQL = @SQL + 
'UNION ALL 
    SELECT ['+ name +'] As DBName, [ClientUserName],[logTime],[uri],[UrlDestHost],[bytesrecvd],[bytessent],[rule] 
    FROM [' + name + '].[dbo].[WebProxyLog] 
    WHERE [ClientUserName] like ''%username%'' 

' 
FROM sys.DataBases 
WHERE name LIKE '%ISALOG%WEB%' 

SET @SQL = STUFF(@SQL, 1, 10, '') + ' ORDER BY DBName' 

PRINT @SQL 

--EXEC(@SQL) 

一旦你打印的SQL和測試它,你可以刪除print行和取消註釋exec行。

進一步閱讀 - 亞倫伯特蘭的Bad habits to kick : relying on undocumented behaviorhis answer對SO關於sp_MSForEachDB的問題。

編輯:選擇小的修正:

'UNION ALL 
SELECT [ClientUserName],[logTime],[uri],[UrlDestHost],[bytesrecvd],[bytessent],[rule] 
FROM [' + name + '].[dbo].[WebProxyLog] 
WHERE [ClientUserName] like ''%username%'' 
' 

至於導致它打印查詢的上市表,對不對?

+0

非常感謝! 我已經稍微編輯了你的SELECT,現在它就像一個魅力! –

+0

「@ SQL」變量在您提到的所有數據庫中都包含一個名爲「WebProxyLog」的表的聯合查詢。我已經將數據庫名稱添加到原始查詢中,但是如果您不需要它,您當然不必使用它。但是,如果答案解決了您的問題,那麼您應該將其標記爲已接受,以便其他人員知道問題已解決。 –

相關問題