SQL 服务器 2012- 使用 sp_msforeachdb

SQL Server 2012- Using 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

你没有指定错误,我不确定这一点,但我猜测 sys.dm_db_index_usage_stats returns 相同的信息,无论你使用的是什么数据库(服务器广阔的视野)。

我想你想要这样的东西...

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
'

重新使用你的过滤器,我不知道它们是否正确。基本上我们正在检查数据库中是否存在有问题的 table。由于您只从 TTT_Clients 中选择,我建议只过滤 WHERE name = ''TTT_Clients'' 而不是只匹配它的正则表达式。