禁用所有非聚集索引

spe*_*der 18 t-sql sql-server indexing sql-server-2008

我使用以下命令从我的数据库中选择了许多非聚集索引:

SELECT  sys.objects.name tableName,
        sys.indexes.name indexName
FROM    sys.indexes
        JOIN sys.objects ON sys.indexes.object_id = sys.objects.object_id
WHERE   sys.indexes.type_desc = 'NONCLUSTERED'
        AND sys.objects.type_desc = 'USER_TABLE'
Run Code Online (Sandbox Code Playgroud)

我想在每个结果上运行以下命令:

ALTER INDEX indexName ON tableName DISABLE
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?有没有更好的办法?

编辑

我这样做是为了截断表,然后用"ALTER INDEX bla ON table REBUILD"重建.这需要自动化,因此丢弃和重建将是一个更高的维护活动,我宁愿避免.这是一个糟糕的计划吗?我需要一种以最小的开销清空表的方法.

Dan*_*lan 33

您可以将查询构建到select语句中,如下所示:

DECLARE @sql AS VARCHAR(MAX)='';

SELECT @sql = @sql + 
'ALTER INDEX ' + sys.indexes.name + ' ON  ' + sys.objects.name + ' DISABLE;' +CHAR(13)+CHAR(10)
FROM 
    sys.indexes
JOIN 
    sys.objects 
    ON sys.indexes.object_id = sys.objects.object_id
WHERE sys.indexes.type_desc = 'NONCLUSTERED'
  AND sys.objects.type_desc = 'USER_TABLE';

EXEC(@sql);
Run Code Online (Sandbox Code Playgroud)

字符13和图10是换行/回车符号,所以可以通过替换检查输出EXECPRINT,这将是更具有可读性.