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''
а не это регулярное выражение, которое просто соответствует ему.