SQL Server 2012- использование sp_msforeachdb

Я хочу запустить SELECT заявление только на некоторые конкретные базы данных. Список баз данных возвращается по этому запросу:

DECLARE @OneWeekAgo DATETIME
SELECT @OneWeekAgo = DATEADD(week,-1,GETDATE())

select distinct DB_NAME(database_id) DatabaseName 
into #temp
from sys.dm_db_index_usage_stats
where DB_NAME(database_id) like 'TTT[_][a-z]%'
  and DB_NAME(database_id) not like '%test%' 
  and last_user_update > @OneWeekAgo

Теперь, когда все эти базы данных возвращены, я хочу выполнить простой запрос:

SELECT * 
FROM TTT_Clients 
WHERE country like 'SWEDEN'

Как я могу это сделать? Я получаю ошибки в строке "IN (SELECT DISTINCT...)", используя что-то вроде этого:

exec sp_msforeachdb ' use [?] IF  ''?'' in (select distinct DB_NAME(database_id) DatabaseName 
                                            from sys.dm_db_index_usage_stats
                                            where DB_NAME(database_id) like  ''TTT[_][a-z]%'' 
                                              and DB_NAME(database_id) not like ''%test%'') 
BEGIN
    SELECT * FROM TTT_Clients WHERE country like ''SWEDEN''
END

1 ответ

Решение

Вы не указали ошибку, и я не знаю это наверняка, но я предполагаю, что sys.dm_db_index_usage_stats возвращает одну и ту же информацию независимо от используемой вами базы данных (общий вид сервера).

Я думаю, что вы хотите что-то вроде этого...

exec sp_msforeachdb ' use [?];
IF ('[?]' NOT LIKE ''%test%'' AND EXISTS(SELECT * FROM sys.tables WHERE name LIKE ''TTT[_][a-z]%''))
BEGIN
    SELECT * FROM TTT_Clients WHERE country like ''SWEDEN''
END
'

Повторно используя ваши фильтры, я не знаю, правильны они или нет. В основном мы проверяем, существует ли соответствующая таблица в базе данных. Поскольку вы выбираете только из TTT_Clients Я бы предложил просто фильтрацию WHERE name = ''TTT_Clients'' а не это регулярное выражение, которое просто соответствует ему.

Другие вопросы по тегам