2009-07-24 30 views

Trả lời

22

Tôi tìm thấy một chức năng trên this trang đó sẽ giúp bạn ra ngoài:

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

Hoặc, chỉ cần lấy logic này và thêm nó như là một tham gia vào truy vấn ban đầu –

+6

Hãy nhận biết rằng sys.indexes i s cơ sở dữ liệu cụ thể. Trong câu hỏi trên, người dùng hiển thị truy vấn tới sys.dm_db_index_usage_stats và chỉ định database_id trong hàm OBJECT_NAME. Hàm này sẽ chỉ trả về kết quả cho cơ sở dữ liệu hiện đang mở. –

10

Hoặc tốt hơ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

đã cố gắng xóa dấu ngoặc đơn bổ sung làm lỗi khi biên dịch, nhưng không thể lưu chỉnh sửa dưới dạng 6 ký tự –

-1

Tôi đã đi kèm với giải pháp này, các công trình lớn:

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 
Các vấn đề liên quan