如何在SQL Server中检查是否可以从数据库中删除索引

如何在SQL Server中检查是否可以从数据库中删除索引,sql,sql-server-2005,indexing,Sql,Sql Server 2005,Indexing,在对DB进行大规模重新设计之后,我需要删除其中的所有索引,并设置新的索引。 我发现好的SCRIPT可以获取所有索引并删除,但我有一个问题——我无法删除由主键约束创建的索引。也许还有其他我无法删除的指标 我的问题是:如何更改下面的代码以删除除为主键创建的索引或其他我无法手动删除的索引之外的所有索引 DECLARE @indexName VARCHAR(128) DECLARE @tableName VARCHAR(128) DECLARE [indexes] CURSOR FOR SEL

在对DB进行大规模重新设计之后,我需要删除其中的所有索引,并设置新的索引。 我发现好的SCRIPT可以获取所有索引并删除,但我有一个问题——我无法删除由主键约束创建的索引。也许还有其他我无法删除的指标

我的问题是:如何更改下面的代码以删除除为主键创建的索引或其他我无法手动删除的索引之外的所有索引

DECLARE @indexName VARCHAR(128)
DECLARE @tableName VARCHAR(128)

DECLARE [indexes] CURSOR FOR
    SELECT  [sysindexes].[name] AS [Index], [sysobjects].[name] AS [Table]
    FROM [sysindexes]
    INNER JOIN [sysobjects] ON [sysindexes].[id] = [sysobjects].[id]    
    WHERE [sysindexes].[name] IS NOT NULL AND [sysobjects].[type] = 'U'

OPEN [indexes]

FETCH NEXT FROM [indexes] INTO @indexName, @tableName
WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC ('DROP INDEX [' + @indexName + '] ON [' + @tableName + ']')
    FETCH NEXT FROM [indexes] INTO @indexName, @tableName
END

CLOSE [indexes]
DEALLOCATE [indexes]
您可以尝试使用sys.indexes目录视图,而不是不推荐使用的sysindexes

该目录视图有一个列调用is_primary_key,因此您应该能够找到所有非primary key索引,如下所示:

SELECT *
FROM sys.indexes
WHERE is_primary_key = 0
您可以通过以下方式轻松创建DROP INDEX语句:

SELECT 'DROP INDEX ' + name + ' ON ' + object_name(object_id)
FROM sys.indexes
WHERE is_primary_key = 0
AND object_ID > 255     -- exclude system-level tables with object_id <= 255
AND name IS NOT NULL    -- exclude heaps with a NULL index name
只需复制并粘贴此语句的输出,然后运行该语句,就可以了。

您可以尝试使用sys.indexes目录视图,而不是不推荐使用的sysindexes

该目录视图有一个列调用is_primary_key,因此您应该能够找到所有非primary key索引,如下所示:

SELECT *
FROM sys.indexes
WHERE is_primary_key = 0
您可以通过以下方式轻松创建DROP INDEX语句:

SELECT 'DROP INDEX ' + name + ' ON ' + object_name(object_id)
FROM sys.indexes
WHERE is_primary_key = 0
AND object_ID > 255     -- exclude system-level tables with object_id <= 255
AND name IS NOT NULL    -- exclude heaps with a NULL index name

只需复制并粘贴此语句的输出,然后运行它,您就应该完成了。

根据Marc的回答,我找到了正确的脚本版本:

SELECT 'DROP INDEX ' + name + ' ON ' + object_name(object_id)
FROM sys.indexes
WHERE is_primary_key = 0 AND is_unique_constraint = 0
AND OBJECTPROPERTY(object_id, 'IsMSShipped') = 0     -- exclude system-level tables
AND name IS NOT NULL
检查对象Id是否大于255是不够的: -我们必须使用OBJECTPROPERTYobject_id,“IsMSShipped”=0,因为某些系统表(如queue_消息)的id非常高 -此外,我们还必须检查索引是否由唯一约束创建:is_unique_constraint=0


在这些改进之后,它将删除用户创建的所有索引。

根据Marc_的答案,我找到了正确的脚本版本:

SELECT 'DROP INDEX ' + name + ' ON ' + object_name(object_id)
FROM sys.indexes
WHERE is_primary_key = 0 AND is_unique_constraint = 0
AND OBJECTPROPERTY(object_id, 'IsMSShipped') = 0     -- exclude system-level tables
AND name IS NOT NULL
检查对象Id是否大于255是不够的: -我们必须使用OBJECTPROPERTYobject_id,“IsMSShipped”=0,因为某些系统表(如queue_消息)的id非常高 -此外,我们还必须检查索引是否由唯一约束创建:is_unique_constraint=0


在这些改进之后,它将删除用户创建的所有索引。

最好使用该表,谢谢-但是运行由它生成的代码是有风险的-它也会从systables中删除索引,并为堆类型的索引返回null-我的示例中的代码只为自定义表返回索引如果您在该语句中添加且object_ID>255且name不为null,则会得到相同的结果;所有id<255的系统级表都被排除在外,索引名为NULLok的堆也被排除在外,谢谢-这样更好。现在有了我的索引和一些索引,比如:queue\u clustered\u index-你知道它是什么吗?@Korn-Marek K.对不起,我不知道或者没有你的数据库-我不能告诉你那些是什么。。。。。DROP INDEX语句应该列出定义索引的表-检查该表…使用该表是一个很好的建议,谢谢-但是运行由它生成的代码是有风险的-它也会从systables中删除索引,并为堆类型的索引返回null-我的示例中的代码只为自定义表返回索引如果您在该语句中添加且object_ID>255且name不为null,则会得到相同的结果;所有id<255的系统级表都被排除在外,索引名为NULLok的堆也被排除在外,谢谢-这样更好。现在有了我的索引和一些索引,比如:queue\u clustered\u index-你知道它是什么吗?@Korn-Marek K.对不起,我不知道或者没有你的数据库-我不能告诉你那些是什么。。。。。DROPINDEX语句应该列出定义索引的表-检查该表。。。。