2009-07-24 1 views

Odpowiedz

22

Znalazłem funkcję na this strony, która powinna ci pomóc:

CREATE FUNCTION dbo.index_name (@object_id int, @index_id int) 
RETURNS sysname 
AS 
BEGIN 
    RETURN(SELECT name FROM sys.indexes WHERE object_id = @object_id and index_id = @index_id) 
END; 
+8

Lub po prostu weź tę logikę i dodaj ją jako dołączenie do pierwotnego zapytania. –

+6

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. –

10

Albo jeszcze lepiej:

SELECT OBJECT_NAME(d.object_id, d.database_id) AS objectname , 
     d.index_id , 
     i.name , 
     * 
FROM sys.dm_db_index_usage_stats AS d 
     LEFT OUTER JOIN sys.indexes AS i ON i.object_id = d.object_id 
              AND i.index_id = d.index_id 
+1

próbował usunąć dodatkowy nawias jako błąd podczas kompilacji, ale nie może zapisać zmiany jako nie 6 znaków –

-1

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