2017-01-30 2 views
2

Мне нужно запросить все таблицы с определенным именем во всех базах данных на сервере. Базы данных ежедневно создаются ISA, а их имена генерируются маской ISALOG_ current_date _WEB_000. Каждая база данных содержит таблицу WebProxyLog. Общее количество баз данных - 60. Моя цель - запросить WebProxyLog таблицу во всех базах данных или в базах данных конкретных дат. Что-то вроде петли Еогеасп:Выберите из всех таблиц во всех базах данных с определенным именем

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 behavior Аарона Бертрана и his answer на вопрос о SO о sp_MSForEachDB.

Edit: небольшая коррекция ВЫБОР:

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

В результате он выводит список запросов к таблицам, верно?

+0

Большое спасибо! Я немного изменил ваш SELECT, и теперь он работает как шарм! –

+0

Переменная '@ SQL' содержит запрос объединения для таблиц с именем' WebProxyLog' во всех упомянутых вами базах данных. Я добавил имя базы данных в исходный запрос, но, конечно, вам не нужно использовать его, если он вам не нужен. Однако, если ответ решил вашу проблему, тогда вы должны пометить ее как принятую, чтобы другие люди знали, что проблема решена. –

Смежные вопросы