2009-07-24 5 views

Respuesta

22

me encontré con una función en this página que debería ayudar a salir:

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

O, simplemente tome esta lógica y agréguela como unir a la consulta original –

+6

Tenga en cuenta que sys.indexes i s base de datos específica. En la pregunta anterior, el usuario muestra una consulta a sys.dm_db_index_usage_stats y especifica database_id en la función OBJECT_NAME. Esta función solo arrojará resultados para la base de datos abierta actualmente. –

10

O mejor aún:

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

intentado eliminar el paréntesis adicional como su error al compilar, pero no se puede guardar la edición como no tiene 6 caracteres –

-1

He venido con esta solución, funciona muy bien:

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 
Cuestiones relacionadas