Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SQLServer2005中从IndexId获取索引名_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql server 如何在SQLServer2005中从IndexId获取索引名

Sql server 如何在SQLServer2005中从IndexId获取索引名,sql-server,sql-server-2005,Sql Server,Sql Server 2005,我正在运行以下查询以列出索引的大小和碎片: SELECT object_name(object_id, database_id) as objectname), index_id, * FROM sys.dm_db_index_usage_stats 是否有一个SQL函数可用于将索引id转换为索引名称?我在第页找到一个函数,该函数可以帮助您: CREATE FUNCTION dbo.index_name (@object_id int, @index_id int) RETURNS sysna

我正在运行以下查询以列出索引的大小和碎片:

SELECT object_name(object_id, database_id) as objectname), index_id, *
FROM sys.dm_db_index_usage_stats
是否有一个SQL函数可用于将
索引id
转换为索引名称?

我在第页找到一个函数,该函数可以帮助您:

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; 
或者更好:

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

我提供了这个解决方案,效果非常好:

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 
创建表dbo.IndexNames
(数据库\u id int不为空,对象\u id int不为空,索引\u id int不为空,索引\u name sysname不为空)
去
创建过程dbo.gathereIndexNames
作为
开始
声明@cur游标
,@name varchar(128)
,@sql varchar(最大值)
截断表dbo.IndexNames
为从sys.databases中选择名称设置@cur=cursor
其中数据库\u id>=5
开@cur
从@cur取下一个到@name
而@@fetch\u status=0
开始
set@sql='1!'
插入到dbo.IndexNames中
(数据库id、对象id、索引id、索引名称)
选择db_id('''+@name++'')、t.object_id、i.index_id、i.name
来自['+@name+'.[sys].[tables]t
内部联接['+@name+'].[sys].[index]i
在t.OBJECT\u ID=i.OBJECT\u ID上
其中i.index_id 0'
exec(@sql)
从@cur取下一个到@name
结束

或者,只需将此逻辑作为连接添加到原始查询即可。请注意sys.indexes是特定于数据库的。在上面的问题中,用户显示了对sys.dm_db_index_usage_stats的查询,并在OBJECT_NAME函数中指定数据库_id。此函数将仅返回当前打开的数据库的结果。编译时,尝试删除附加括号作为其错误,但是无法将编辑保存为非6个字符。这与
sys.indexes
的效果不太好,它是每个数据库视图的索引,而
sys.dm\u db\u index\u usage\u stats
返回所有实例数据库的数据,因此大多数
i.name
都是空的。