游标方式 删除制定表索引 保留部分索引

一:需求描述

由于历史原因,编者维护的某个项目中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  欢迎入群 交流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从入门到放弃-咖啡豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值