我想找到一种方法,通过 SQL Server 中的单个查询从多个表中删除多个索引。我可以使用下面的查询找到索引名称和表,但我有点不知道应该如何删除它找到的表。
SELECT
so.name AS TableName
, si.name AS IndexName
, si.type_desc AS IndexType
FROM
sys.indexes si
JOIN sys.objects so ON si.[object_id] = so.[object_id]
WHERE
so.type = 'U' --Only get indexes for User Created Tables
AND si.name IS NOT NULL
and si.name like 'NCI%'
ORDER BY
so.name, si.type
最佳答案
您可以从 SELECT
开始构建您的放置脚本:
DECLARE @SQL NVARCHAR(MAX) = N''
SELECT @SQL = @SQL + 'DROP INDEX ' + so.name + '.' + si.name + ';' + CHAR(13) + CHAR(10)
FROM
sys.indexes si
JOIN sys.objects so ON si.[object_id] = so.[object_id]
WHERE
so.type = 'U' --Only get indexes for User Created Tables
AND si.name IS NOT NULL
and si.name like '%%'
ORDER BY
so.name, si.type
PRINT @SQL
EXEC (@SQL)
@SQL
是增量构建的,将包含所有由 ;
分隔的 DROP
语句,以便它们在单个批处理中执行。 DROP
表可以用类似的方式完成。
注意:您的查询还捕获与 PK
关联的索引,并且它们不能直接删除,因为它们被约束加倍(PK = 约束 + 索引)
关于sql - 如果名称类似,则删除索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35783119/