Przyszedłem z tego rozwiązania, działa świetnie:
create table dbo.IndexNames
(database_id int not null, object_id int not null, index_id int not null, index_name sysname not null)
go
create procedure dbo.GatherIndexNames
as
begin
declare @cur cursor
,@name varchar(128)
,@sql varchar(max)
truncate table dbo.IndexNames
set @cur = cursor for select name from sys.databases
where database_id >= 5
open @cur
fetch next from @cur into @name
while @@fetch_status = 0
begin
set @sql = '
insert into dbo.IndexNames
(database_id, object_id, index_id, index_name)
select db_id(''' + @name + '''),t.object_id, i.index_id, i.name
from [' + @name + '].[sys].[tables] t
inner join [' + @name + '].[sys].[indexes] i
on t.OBJECT_ID = i.object_id
where i.index_id <> 0'
exec (@sql)
fetch next from @cur into @name
end
Lub po prostu weź tę logikę i dodaj ją jako dołączenie do pierwotnego zapytania. –
Pamiętaj, że sys.indexes i specyficzne dla bazy danych. W powyższym pytaniu użytkownik wyświetla zapytanie do sys.dm_db_index_usage_stats i określa database_id w funkcji OBJECT_NAME. Ta funkcja zwróci wyniki tylko dla aktualnie otwartej bazy danych. –