Estou escrevendo um procedimento armazenado que usa um nome de banco de dados como argumento e retorna uma tabela dos índices desse banco de dados e seu nível de fragmentação. Este procedimento armazenado permanecerá em nosso banco de dados DBA (o banco de dados que contém tabelas que os DBAs usam para monitorar e otimizar as coisas). Os sistemas em questão são todos do SQL Server 2008 R2, se isso faz diferença.
Eu tenho a consulta básica elaborada, mas estou tentando fornecer os nomes reais dos índices. Que eu saiba, essas informações estão contidas na exibição de sys.indexes de cada indivíduo. Meu problema específico é tentar referenciar essa exibição programaticamente do procedimento armazenado de outro banco de dados.
Para ilustrar, esta é a parte da consulta em questão:
FROM sys.dm_db_index_physical_stats(@db_id,NULL,NULL,NULL,NULL) p
INNER JOIN sys.indexes b ON p.[object_id] = b.[object_id]
AND p.index_id = b.index_id
AND b.index_id != 0
A consulta funciona bem quando executada no banco de dados identificado por @db_id, porque está usando a exibição sys.indexes adequada. Se eu tentar chamar isso do banco de dados DBA, no entanto, tudo será nulo, pois a exibição sys.indexes é para o banco de dados errado.
Em termos mais gerais, eu preciso ser capaz de fazer algo assim:
DECLARE @db_name NVARCHAR(255) = 'my_database';
SELECT * FROM @db_name + '.sys.indexes';
ou
USE @db_name;
Tentei alternar bancos de dados ou fazer referência a outros bancos de dados usando combinações de concatenação de strings e funções OBJECT_NAME / OBJECT_ID / DB_ID e nada parece funcionar. Aprecio todas as idéias que a comunidade possa ter, mas suspeito que precisarei refazer esse procedimento armazenado para residir em cada banco de dados individual.
Agradecemos antecipadamente por quaisquer sugestões.