Я пишу збережену процедуру, яка приймає ім'я бази даних як аргумент і повертає таблицю індексів цієї бази даних та рівня їх фрагментації. Ця збережена процедура буде жити в нашій базі даних DBA (БД, що містить таблиці, які DBA використовують для моніторингу та оптимізації речей). Усі ці системи - це SQL Server 2008 R2, якщо це має значення.
У мене базовий запит розроблений, але я застряг у спробі надати фактичні імена індексів. Наскільки мені відомо, ця інформація міститься у поданні sys.indexes кожного. Моя конкретна проблема намагається посилатися на цей погляд програмно із збереженої процедури іншої бази даних.
Для ілюстрації, це частина запиту, про який йде мова:
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
Запит працює нормально, коли виконується з бази даних, ідентифікованої @db_id, оскільки він використовує правильний перегляд sys.indexes. Якщо я спробую викликати це з бази даних DBA, однак це все стає нульовим, оскільки подання sys.indexes призначене для неправильної бази даних.
Більш загально кажучи, мені потрібно вміти робити щось подібне:
DECLARE @db_name NVARCHAR(255) = 'my_database';
SELECT * FROM @db_name + '.sys.indexes';
або
USE @db_name;
Я спробував перемикати бази даних або посилатися на інші бази даних за допомогою комбінації рядкових конкатенацій та функцій OBJECT_NAME / OBJECT_ID / DB_ID, і, здається, нічого не працює. Буду вдячний за будь-які ідеї спільноти, але підозрюю, що мені доведеться перезавантажити цю збережену процедуру, щоб розміститись у кожній окремій базі даних.
Заздалегідь дякую за будь-які пропозиції.