簡體   English   中英

從具有特定名稱的所有數據庫的所有表中選擇

[英]Select from all tables in all databases with specific name

我需要查詢服務器上所有數據庫中具有特定名稱的所有表。 數據庫每天由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%''
    }
}

如果查詢結果將合並到單個表或視圖中,則非常理想。 有辦法執行嗎?

有一個未記錄的存儲過程,稱為sp_MSForEachDB,但是,我不會急於使用未記錄的功能。 這可以通過使用從sys.DataBases系統表獲取數據庫名稱的動態SQL來完成:

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行的注釋。

進一步閱讀-亞倫·貝特朗(Aaron Bertrand)的不良習慣:依賴未記錄的行為,以及對關於sp_MSForEachDB的問題的回答

編輯:SELECT的小更正:

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

結果將查詢列表打印到表中,對不對?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM