J'écris une procédure stockée qui prend un nom de base de données comme argument et renvoie une table des index de cette base de données et leur niveau de fragmentation. Cette procédure stockée vivra dans notre base de données DBA (la base de données qui contient les tables que les DBA utilisent pour surveiller et optimiser les choses). Les systèmes en question sont tous SQL Server 2008 R2 si cela fait une différence.
J'ai la requête de base élaborée, mais je suis coincé à essayer de fournir les noms réels des index. À ma connaissance, cette information est contenue dans la vue sys.indexes de chaque individu. Mon problème spécifique essaie de référencer cette vue par programme à partir d'une procédure stockée d'une autre base de données.
Pour illustrer, voici la partie de la requête en cause:
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
La requête fonctionne correctement lorsqu'elle est exécutée à partir de la base de données identifiée par @db_id, car elle utilise la vue sys.indexes appropriée. Si j'essaie d'appeler cela à partir de la base de données DBA, cependant, tout est nul, car la vue sys.indexes est pour la mauvaise base de données.
De manière plus générale, je dois pouvoir faire quelque chose comme ceci:
DECLARE @db_name NVARCHAR(255) = 'my_database';
SELECT * FROM @db_name + '.sys.indexes';
ou
USE @db_name;
J'ai essayé de changer de base de données ou de référencer d'autres bases de données en utilisant des combinaisons de concaténation de chaînes et de fonctions OBJECT_NAME / OBJECT_ID / DB_ID et rien ne semble fonctionner. J'apprécierais toutes les idées que la communauté pourrait avoir, mais je soupçonne que je devrai réorganiser cette procédure stockée pour résider dans chaque base de données individuelle.
Merci d'avance pour toute suggestion.