sql - 如果名称类似,则删除索引

标签 sql sql-server

我想找到一种方法,通过 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/

相关文章:

mysql - SQL查询连接两个表并过滤第一个表中的行而第二个表中没有相应的条目

mysql - 如何在 SQL 中获取金额范围?

sql - 如何在存储过程中设置日期时间可选参数?

c# - 如何根据日期自动运行 SQL 查询?

mysql - 带外键的 SQL 条件

sql - TSQL 插入错误 - 字符串或二进制数据将被截断

ASP.NET 搜索引擎

sql - 如何在sql server中进行交易技术分析计算?

c# - ServiceStack OrmLite - 处理默认列和计算列

Sql Order By ...使用 `Case When` 进行不同的升序、降序和自定义顺序