一:需求描述
由于历史原因,编者维护的某个项目中MSSQL数据库中部分表的索引设置的不是很合理,所以需要将某些表中的某些索引保留,某
些索引删除。
二:需求分析
该需求其实处理的方式还是比较多的,但由于涉及到的C端比较多,需要通过一次性一个脚本,全部C端进行更新。
读者可能想到的最简单方式就是先全部删除,再创建需要的索引。但编者思维可能比较奇葩,第一个想到的解决方式是游标方式进
行操作。本篇文章也给大家提供一个解决方案和思路,大佬勿喷。
三:解决方案
USE ZyDis1 --使用数据库
--定义变量
DECLARE @a nvarchar(200)
DECLARE @b nvarchar(200)
DECLARE @c nvarchar(200)
DECLARE @d nvarchar(200)
DECLARE @e nvarchar(200)
DECLARE @indexName nvarchar(200)
DECLARE CUR_TEST CURSOR LOCAL SCROLL FOR --定义游标
SELECT a.name,c.name as tblname,d.name as keysname,d.colid, a.indid FROM sysindexes a
JOIN sysindexkeys b ON a.id = b.id AND a.indid = b.indid
JOIN sysobjects c ON b.id = c.id
JOIN syscolumns d ON b.id = d.id AND b.colid = d.colid
WHERE a.indid NOT IN (0, 255)
AND c.name in('DELIVERY_COMMAND_HEADER','DELIVERY_COMMAND_ITEM','DELIVERY_HEADER',
'DELIVERY_ITEM','DELIVERY_BOX','PRODUCT_PRICE_RULE') --查指定表中的索引
OPEN CUR_TEST --打开游标
FETCH NEXT FROM CUR_TEST --开始遍历游标,将结果集的每一行赋值到变量中
INTO @a,@b,@c,@d,@e
WHILE(@@FETCH_STATUS=0) --循环游标 返回被 FETCH 语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。
BEGIN
PRINT(@a+'---'+@b+'---'+@c) --对结果集的每一行数据进行操作
if(@b='DELIVERY_COMMAND_ITEM' and @c <> 'IS_SYNC' and @c <> 'PRODUCT_ID' and @c <> 'CREATED_STAMP' and @e!=1) --表DELIVERY_COMMAND_ITEM 中索引中的keys为is_sync...删除
begin
set @indexName='drop index '+@b+'.'+@a --定义删除索引语句
--PRINT('delete'+@indexName+'--')
exec(@indexName)
end
else
if(@b='DELIVERY_COMMAND_HEADER' and @c <> 'IS_SYNC' and @c <> 'PROD_CATALOG_ID' and @c <> 'PRODUCT_STORE_ID' and @c <> 'CREATED_STAMP' and @e!=1)
begin
set @indexName='drop index '+@b+'.'+@a
exec (@indexName)
--PRINT('no delete')
end
else if(@b='DELIVERY_HEADER' and @c <> 'IS_SYNC' and @e!=1)
begin
set @indexName='drop index '+@b+'.'+@a
exec (@indexName)
end
else if(@b='DELIVERY_ITEM' and @c <> 'IS_SYNC' and @e!=1)
begin
set @indexName='drop index '+@b+'.'+@a
exec (@indexName)
end
else if(@b='DELIVERY_BOX' and @c <> 'IS_SYNC' and @e!=1)
begin
set @indexName='drop index '+@b+'.'+@a
exec (@indexName)
end
else
begin
PRINT('no delete')
end
FETCH NEXT FROM CUR_TEST
INTO @a,@b,@c,@d,@e
END
CLOSE CUR_TEST --关闭游标
DEALLOCATE CUR_TEST --释放游标
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.NET C# JAVA 基础交流群 1095936339 欢迎入群 交流