Sto scrivendo una procedura memorizzata che accetta un nome di database come argomento e restituisce una tabella degli indici di quel database e il loro livello di frammentazione. Questa procedura memorizzata vivrà nel nostro database DBA (il DB che contiene le tabelle utilizzate dai DBA per monitorare e ottimizzare le cose). I sistemi in questione sono tutti SQL Server 2008 R2 se ciò fa la differenza.
Ho elaborato la query di base, ma sono bloccato nel tentativo di fornire i nomi effettivi degli indici. Per quanto ne so, tali informazioni sono contenute nella vista sys.indexes di ogni individuo. Il mio problema specifico è provare a fare riferimento a tale vista a livello di codice dalla stored procedure di un altro database.
Per illustrare, questa è la parte della query in questione:
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 query funziona correttamente quando viene eseguita dal database identificato da @db_id, poiché utilizza la vista sys.indexes corretta. Se provo a chiamarlo dal database DBA, tuttavia, tutto risulta nullo, poiché la vista sys.indexes è per il database errato.
In termini più generali, devo essere in grado di fare qualcosa del genere:
DECLARE @db_name NVARCHAR(255) = 'my_database';
SELECT * FROM @db_name + '.sys.indexes';
o
USE @db_name;
Ho provato a cambiare database o fare riferimento ad altri database usando combinazioni di concatenazioni di stringhe e OBJECT_NAME / OBJECT_ID / DB_ID e nulla sembra funzionare. Apprezzerei tutte le idee che la comunità potrebbe avere, ma sospetto che dovrò riorganizzare questa procedura memorizzata per risiedere in ogni singolo database.
Grazie in anticipo per eventuali suggerimenti.