我从我的数据库中选择了一些非聚集索引,具体如下:
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'
我想在每个结果上运行以下内容:
ALTER INDEX indexName ON tableName DISABLE
我该怎么做呢?有没有更好的办法?
编辑
我这样做是为了截断表,然后使用“ALTER INDEX bla ON table REBUILD”进行重建.这需要自动化,所以丢弃和重建将是一个更高的维护活动,我宁愿避免.这是坏的计划吗?我需要一种以最少的开销排空桌子的手段.
解决方法
您可以将查询构建为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);
Chars 13和10是换行/回车,所以您可以通过用PRINT替换EXEC来检查输出,并且它将更加可读.