Indexing 删除SQL Server 2012中表的用户定义索引

Indexing 删除SQL Server 2012中表的用户定义索引,indexing,sql-server-2012,Indexing,Sql Server 2012,我在Sql Server 2012中有一个表Categ12\u Items,它创建了用户定义的索引。它们被命名为index1、index2、index3、index4、index5、index6、index7、index8、index9、index10。这只是一个示例,最后一个索引可以是index10或index11或index55或index100,这意味着从index5开始,可以创建任意数量的索引,这些索引将始终按顺序命名 重新填充表数据时,不必删除从index1到index4的前4个索引,

我在Sql Server 2012中有一个表
Categ12\u Items
,它创建了用户定义的索引。它们被命名为
index1、index2、index3、index4、index5、index6、index7、index8、index9、index10
。这只是一个示例,最后一个索引可以是index10或index11或index55或index100,这意味着从index5开始,可以创建任意数量的索引,这些索引将始终按顺序命名

重新填充表数据时,不必删除从index1到index4的前4个索引,但需要删除并重新创建从index5开始的所有其他索引

我的问题是如何删除从index5开始的所有索引。当然,我可以像下面的T-SQL那样使用drop单独索引,但我试图在一条语句中实现这一点。可能有我找不到的系统定义的存储过程

问题:是否有系统定义的存储过程可以删除表上的多个索引

DROP INDEX index5 on Categ12_Items;
DROP INDEX index6 on Categ12_Items;
DROP INDEX index7 on Categ12_Items;
DROP INDEX index8 on Categ12_Items;
DROP INDEX index9 on Categ12_Items;
DROP INDEX index10 on Categ12_Items;
参考:

您可以禁用索引,并在完成所需操作后重建它们

禁用索引:

declare @tablename sysname = 'dbo.Categ12_Items';
declare @indexes nvarchar(max);

set @indexes = stuff((
  select
      char(10)+'alter index '+quotename(i.name)+' on '
      +quotename(schema_name(o.schema_id))
      +'.' +quotename(object_name(i.object_id))
      +' disable;'
  from  sys.indexes as i
    inner join sys.objects o 
      on i.object_id = o.object_id
  where o.is_ms_shipped=0
    and i.object_id = object_id(@tablename)
    and i.name not in ('index_1','index_2','index_3','index_4')
  order by i.name
  for xml path (''), type).value('.','varchar(max)')
  ,1,1,'');

--select @indexes as disabling_indexes;
exec sp_executesql @indexes;
set @indexes = stuff((
  select
      char(10)+'alter index '+quotename(i.name)+' on '
      +quotename(schema_name(o.schema_id))
      +'.'+quotename(object_name(i.object_id))
      +' rebuild;'
  from  sys.indexes as i
    inner join sys.objects o 
      on i.object_id = o.object_id
  where o.is_ms_shipped=0
    and i.object_id = object_id(@tablename)
    and i.name not in ('index_1','index_2','index_3','index_4')
  order by i.name
  for xml path (''), type).value('.','varchar(max)')
  ,1,1,'');

--select @indexes as rebuilding_indexes;
exec sp_executesql @indexes;
然后做你的事:

/* do stuff */
--select 'doing some stuff' as done;
/* done with doing stuff*/
然后重建索引:

declare @tablename sysname = 'dbo.Categ12_Items';
declare @indexes nvarchar(max);

set @indexes = stuff((
  select
      char(10)+'alter index '+quotename(i.name)+' on '
      +quotename(schema_name(o.schema_id))
      +'.' +quotename(object_name(i.object_id))
      +' disable;'
  from  sys.indexes as i
    inner join sys.objects o 
      on i.object_id = o.object_id
  where o.is_ms_shipped=0
    and i.object_id = object_id(@tablename)
    and i.name not in ('index_1','index_2','index_3','index_4')
  order by i.name
  for xml path (''), type).value('.','varchar(max)')
  ,1,1,'');

--select @indexes as disabling_indexes;
exec sp_executesql @indexes;
set @indexes = stuff((
  select
      char(10)+'alter index '+quotename(i.name)+' on '
      +quotename(schema_name(o.schema_id))
      +'.'+quotename(object_name(i.object_id))
      +' rebuild;'
  from  sys.indexes as i
    inner join sys.objects o 
      on i.object_id = o.object_id
  where o.is_ms_shipped=0
    and i.object_id = object_id(@tablename)
    and i.name not in ('index_1','index_2','index_3','index_4')
  order by i.name
  for xml path (''), type).value('.','varchar(max)')
  ,1,1,'');

--select @indexes as rebuilding_indexes;
exec sp_executesql @indexes;
rextester演示:

以下是rextester演示的输出:

+---------------------------------------------------------+
|                    disabling_indexes                    |
+---------------------------------------------------------+
| alter index [index_5] on [dbo].[Categ12_Items] disable; |
| alter index [index_6] on [dbo].[Categ12_Items] disable; |
| alter index [index_7] on [dbo].[Categ12_Items] disable; |
+---------------------------------------------------------+

+------------------+
|       done       |
+------------------+
| doing some stuff |
+------------------+

+---------------------------------------------------------+
|                   rebuilding_indexes                    |
+---------------------------------------------------------+
| alter index [index_5] on [dbo].[Categ12_Items] rebuild; |
| alter index [index_6] on [dbo].[Categ12_Items] rebuild; |
| alter index [index_7] on [dbo].[Categ12_Items] rebuild; |
+---------------------------------------------------------+