前段时间由于业务结构重构,需要将DB中的所有索引中增加一个字段EI以满足重构后的业务需要;于是编写了该过程用以批量实现;

---------- AddOrUpdate End ----------
if exists( select 1 from sys . procedures where name= 'PRO_Add_EI_INDEX')
beginDROP PROCEDURE PRO_Add_EI_INDEX
end
GOCREATE PROCEDURE PRO_Add_EI_INDEX
(@TABLE SYSNAME='Feed_Test'
)
AS
BEGINSET NOCOUNT ONDECLARE @ERROR INT= 0DECLARE @Unique_Index_Constraint_Name NVARCHAR( 128)DECLARE @tmp_index_name NVARCHAR( 512)DECLARE @DEL_INDEX_SQL NVARCHAR( 1280)---临时存储表上索引属性的信息CREATE TABLE   #ALL_INDEX(ID INT IDENTITY ( 1, 1 ) NOT NULL PRIMARY KEY ,INDEX_NAME        VARCHAR( 512),INDEX_DESCRIPTION VARCHAR (512),INDEX_KEYS        VARCHAR( 512),INDEX_INCLUDE     VARCHAR( 512))--获取表结构信息INSERT INTO #ALL_INDEX (INDEX_NAME, INDEX_DESCRIPTION,INDEX_KEYS )EXEC Sp_helpindex @TABLE------- 获取包含索引的字段DECLARE @Include VARCHAR( 1000)DECLARE @xy        INTDECLARE @max_count INTDECLARE @UPDATE_SQL NVARCHAR( MAX)DECLARE @dbname sysnameSET @dbname ='[' + Db_name () + ']'SELECT @xy = 1 ,@max_count = MAX(ID )FROM   #ALL_INDEXWHILE @xy <= @max_countBEGINSET @UPDATE_SQL =N'set @Include=nullselect @Include=isnull(@Include+'','','''')+c.namefrom '+ @dbname+ '.sys.columns C join(select column_id,index_column_id from '+ @dbname+ '.sys.index_columnswhere object_id=(select object_id from '+ @dbname + '.sys.tables where name like '''+ @TABLE+ ''') and index_id=(select index_id from '+ @dbname + '.sys.indexes where name='''+ ( SELECT INDEX_NAMEFROM   #ALL_INDEXWHERE  id = @xy)+ ''' AND  OBJECT_ID=OBJECT_ID(N''' + @TABLE+ '''))and is_included_column=1) t on c.object_id=(select object_id from '+ @dbname + '.sys.tables where name like '''+ @TABLE+ ''') and c.Column_id=t.column_idorder by t.index_column_id'EXEC Sp_executesql @UPDATE_SQL, N'@Include varchar(1000) out',@Include outUPDATE #ALL_INDEXSET    Index_Include = Isnull ( @Include,'')WHERE  ID = @xySET @xy =@xy + 1END---将索引 信息备份写入到 维护库的对应表中INSERT INTO DBA_Maintenance. dbo. source_table_indexSELECT Db_name (),@TABLE,INDEX_NAME,INDEX_DESCRIPTION,CASE RIGHT( INDEX_KEYS,3 )WHEN '(-)' THEN LEFT(INDEX_KEYS, Len(INDEX_KEYS ) - 3)ELSE INDEX_KEYSEND INDEX_KEYS ,INDEX_INCLUDEFROM   #ALL_INDEX--               ---将DB中所有约束备份保存到 维护库的对应表中INSERT INTO DBA_Maintenance. dbo. source_table_constraints select db_name(), object_name (parent_object_id), name from sys . key_constraints WHERE   parent_object_id=OBJECT_ID (N'' + @TABLE+'' )BEGIN TRANSACTION TRA_NAME----删除唯一约束(包括主键唯一约束)DECLARE @Drop_Unique_Index_Sql nvarchar( 1280)DECLARE @J INT= 1DECLARE @JCOUNT INT= 0DECLARE @DROP_CONSTRAINT_SQL NVARCHAR( 3200)
/*SELECT @JCOUNT=COUNT(*)FROM  [DBA_Maintenance].[dbo].[source_table_index] WITH(NOLOCK)WHERE DBNAME = Db_name()AND TABLENAME = @TABLEAND INDEX_DESCRIPTION  LIKE '%unique%'WHILE @J<=@JCOUNTBEGINSELECT @Unique_Index_Constraint_Name=Index_NameFROM (SELECT Index_Name,row_number()over(order by Index_Name)rnFROM [DBA_Maintenance].[dbo].[source_table_index] WITH(NOLOCK)WHERE DBNAME = Db_name()AND TABLENAME = @TABLEAND INDEX_DESCRIPTION  LIKE '%unique%')AAWHERE rn=@JSET @Drop_Unique_Index_Sql='ALTER TABLE [dbo].['+@TABLE+'] DROP CONSTRAINT ['+@Unique_Index_Constraint_Name+']'--print @@Drop_Unique_Index_SqlEXEC (@Drop_Unique_Index_Sql)SET @J=@J+1END*/SELECT @JCOUNT =COUNT (*) FROM   dba_maintenance. dbo . source_table_constraints WITH(NOLOCK )WHERE DBNAME = Db_name()AND TABLENAME = @TABLEWHILE @J <=@JCOUNTBEGINSELECT @Unique_Index_Constraint_Name =constraintsnameFROM (SELECT constraintsname, ROW_NUMBER() OVER( ORDER BY CONSTRAINTSNAME)RNFROM  dba_maintenance .dbo .source_table_constraints WITH(NOLOCK )WHERE DBNAME = Db_name()AND TABLENAME = @TABLE)AAWHERE RN =@JSET @DROP_CONSTRAINT_SQL ='ALTER TABLE [dbo].[' + @TABLE +'] DROP CONSTRAINT ['+@Unique_Index_Constraint_Name+ ']'print 1print @DROP_CONSTRAINT_SQLEXEC (@DROP_CONSTRAINT_SQL )SET @J =@J + 1ENDDECLARE @I INT= 1DECLARE @COUNT INT= 0---根据维护库中的备份索引属性信息 删除表上对应的非约束类索引SELECT @COUNT = Count(*)FROM   DBA_Maintenance .dbo . source_table_index   a with( nolock)WHERE  DBNAME = Db_name()AND TABLENAME = @TABLEAND Index_Name NOT IN(SELECT constraintsname from DBA_Maintenance. dbo . source_table_constraints  with (nolock )WHERE  DBNAME = Db_name()AND TABLENAME = @TABLE)WHILE @I <= @COUNTBEGIN--print 1.1SELECT @tmp_index_name = index_nameFROM   (SELECT Row_number()OVER(ORDER BY index_name) rn,index_nameFROM   DBA_Maintenance .dbo . source_table_index WITH ( NOLOCK)WHERE  DBNAME = Db_name()AND TABLENAME = @TABLEAND Index_Name NOT IN(SELECT constraintsname from DBA_Maintenance. dbo . source_table_constraints  with(nolock )WHERE  DBNAME = Db_name()AND TABLENAME = @TABLE))tmpWHERE  rn = @ISET @DEL_INDEX_SQL =N'DROP INDEX ' + @tmp_index_name + ' ON '+ @TABLEprint 2print @DEL_INDEX_SQLEXEC (@DEL_INDEX_SQL )SET @ERROR =@@ERROR + @ERRORSET @I =@I + 1END/*
----------重新创建 约束性索引
---由于EI字段设置的为 运行为 null。故不能创建带EI的约束,暂时屏蔽该部分DECLARE @CREATE_CONSTRAINTS_SQL NVARCHAR(MAX)DECLARE @CONSTRAINTS_INDEX_KEYS NVARCHAR(1024)DECLARE @CONSTRAINTS_INDEX_NAME SYSNAMEDECLARE @XJ INT=1DECLARE @XJCOUNT INTSELECT @XJCOUNT=COUNT(*) FROM  [DBA_Maintenance].[dbo].[source_table_index]  WITH(NOLOCK)WHERE DBNAME = Db_name()AND TABLENAME = @TABLEAND  Index_description like 'clustered,%'WHILE @XJ<=@XJCOUNTBEGINSELECT @CONSTRAINTS_INDEX_NAME=index_name,@CONSTRAINTS_INDEX_KEYS=index_keysFROM (SELECT index_name ,index_keys,ROW_NUMBER() OVER( ORDER BY index_name)RNFROM   [DBA_Maintenance].[dbo].[source_table_index] WITH(NOLOCK)WHERE DBNAME = Db_name()AND TABLENAME = @TABLEAND  Index_description like 'clustered,%')AAWHERE RN=@XJIF CHARINDEX(',EI',@CONSTRAINTS_INDEX_KEYS)>=1 or CHARINDEX('EI,',@CONSTRAINTS_INDEX_KEYS)>=1BEGINSET @CREATE_CONSTRAINTS_SQL='ALTER TABLE ' + @TABLE + '+ Char(9)  ADD CONSTRAINT '+ 'EI_'+@CONSTRAINTS_INDEX_NAME+ ' PRIMARY KEY CLUSTERED (' + @CONSTRAINTS_INDEX_KEYS+ ')'ENDELSEBEGINSET @CREATE_CONSTRAINTS_SQL='ALTER TABLE ' + @TABLE + '+ Char(9)  ADD CONSTRAINT '+ 'EI_'+@CONSTRAINTS_INDEX_NAME+ ' PRIMARY KEY CLUSTERED ( EI,' + @CONSTRAINTS_INDEX_KEYS+ ')'END--print 2--print @CREATE_CONSTRAINTS_SQLEXEC (@CREATE_CONSTRAINTS_SQL)SET @XJ=@XJ+1END
*/---重新创建聚集索引 select * from [DBA_Maintenance].[dbo].[source_table_index]  where Index_description like 'clustered%' and Index_description not like 'clustered,%'DECLARE @X INT= 1DECLARE @XCOUNT INT= 0DECLARE @CREATE_CLUSTERED_INDEX_SQL NVARCHAR( MAX)DECLARE @CLUSTERED_INDEX_NAME SYSNAMEDECLARE @CLUSTER_INDEX_KEYS NVARCHAR( 1024)IF @TABLE <>'FeedPermission'BEGINSELECT @XCOUNT =COUNT (*)FROM [DBA_Maintenance] .[dbo] . [source_table_index]WHERE DBNAME = Db_name()AND TABLENAME = @TABLEAND Index_description like 'clustered%'--AND Index_description not like 'clustered,%'  ---同 约束性索引的原因一样WHILE @X <=@XCOUNTBEGINSELECT @CLUSTERED_INDEX_NAME =Index_name ,@CLUSTER_INDEX_KEYS=Index_keysFROM (SELECT index_name, index_keys , ROW_NUMBER() OVER( ORDER BY index_name )RNFROM   [DBA_Maintenance] .[dbo] .[source_table_index] WITH(NOLOCK )WHERE DBNAME = Db_name()AND TABLENAME = @TABLEAND  Index_description like 'clustered%'--AND Index_description not like 'clustered,%' ---同 约束性索引的原因一样
                            )AAWHERE RN =@XIF CHARINDEX (',EI' ,@CLUSTER_INDEX_KEYS)>= 1 or CHARINDEX('EI,' ,@CLUSTER_INDEX_KEYS)>= 1BEGINSET @CREATE_CLUSTERED_INDEX_SQL ='CREATE CLUSTERED INDEX EI_'+@CLUSTERED_INDEX_NAME + Char (9)+ 'ON '+ Char( 9) +@TABLE+ '(' + @CLUSTER_INDEX_KEYS+ ')'ENDELSEBEGINSET @CREATE_CLUSTERED_INDEX_SQL ='CREATE CLUSTERED INDEX EI_'+@CLUSTERED_INDEX_NAME + Char (9)+ 'ON '+ Char( 9) +@TABLE+ '( EI,' + @CLUSTER_INDEX_KEYS+ ')'ENDPRINT 3print @CREATE_CLUSTERED_INDEX_SQLEXEC (@CREATE_CLUSTERED_INDEX_SQL )SET @X =@X + 1ENDENDELSEBEGINCREATE CLUSTERED INDEX EI_PK_FeedPermission_EmployeeID_Feed ON FeedPermission(EI , EmployeeID , FeedID )END---根据维护库中的备份索引属性信息 删除表上对应的非约束类索引(非聚集索引)DECLARE @Y INT= 1DECLARE @YCOUNT INT= 0DECLARE @NONCLUSTERED_INDEX_NAME SYSNAMEDECLARE @NON_INDEX_KEYS NVARCHAR( 1024)DECLARE @CREATE_NON_INDEX_SQL NVARCHAR( MAX)DECLARE @INDEX_INCLUDE_KEYS NVARCHAR( 512)IF  @TABLE <> 'FeedPermission'BEGINSELECT @YCOUNT = Count(*)FROM   DBA_Maintenance .dbo . source_table_indexWHERE  DBNAME = Db_name()AND TABLENAME = @TABLEAND Index_description like 'nonclustered%'WHILE @Y <= @YCOUNTBEGINSELECT @NONCLUSTERED_INDEX_NAME = index_name,@NON_INDEX_KEYS = INDEX_KEYS,@INDEX_INCLUDE_KEYS=INDEX_INCLUDEFROM   (SELECT Row_number()OVER(ORDER BY index_name) rn,index_name,index_keys,index_includeFROM   DBA_Maintenance .dbo . source_table_indexWHERE  DBNAME = Db_name()AND TABLENAME = @TABLEAND Index_description like 'nonclustered%' )tmpWHERE  rn = @Y--由于程序和存储过程中有一个存在指定强制使用feedwork表上的XI_ExecuterID,故这个需单独考虑IF @NONCLUSTERED_INDEX_NAME ='XI_ExecuterID' and @TABLE ='FeedWork'BEGINSET @CREATE_NON_INDEX_SQL =N'CREATE NONCLUSTERED INDEX XI_ExecuterID ON FeedWork(EI, ExecuterID, Deadline, Status)'ENDELSEBEGINIF rtrim (ltrim ( @NON_INDEX_KEYS ))='EI'BEGINIF @INDEX_INCLUDE_KEYS IS NOT NULL AND @INDEX_INCLUDE_KEYS<>''BEGINSET @CREATE_NON_INDEX_SQL =N'CREATE NONCLUSTERED INDEX ' + Char (9 )++ 'EI_' +@NONCLUSTERED_INDEX_NAME + Char (9 ) + ' ON ' + Char (9)+ @TABLE + '(' + @NON_INDEX_KEYS + ')INCLUDE(' + @INDEX_INCLUDE_KEYS + ')'ENDELSEBEGINSET @CREATE_NON_INDEX_SQL =N'CREATE NONCLUSTERED INDEX ' + Char (9 )++ 'EI_' +@NONCLUSTERED_INDEX_NAME + Char (9 ) + ' ON ' + Char (9)+ @TABLE + '(' + @NON_INDEX_KEYS + ')'ENDENDELSEBEGINIF CHARINDEX (',EI' ,@NON_INDEX_KEYS)>= 1 or CHARINDEX('EI,' ,@NON_INDEX_KEYS )>= 1BEGINIF @INDEX_INCLUDE_KEYS IS NOT NULL AND @INDEX_INCLUDE_KEYS<> ''BEGINSET @CREATE_NON_INDEX_SQL =N'CREATE NONCLUSTERED INDEX ' + Char (9 )++ 'EI_' +@NONCLUSTERED_INDEX_NAME + Char (9 ) + ' ON ' + Char ( 9)+ @TABLE + '(' + @NON_INDEX_KEYS + ')INCLUDE(' + @INDEX_INCLUDE_KEYS + ')'ENDELSEBEGINSET @CREATE_NON_INDEX_SQL =N'CREATE NONCLUSTERED INDEX ' + Char (9 )++ 'EI_' +@NONCLUSTERED_INDEX_NAME + Char (9 ) + ' ON ' + Char ( 9)+ @TABLE + '(' + @NON_INDEX_KEYS + ')'ENDENDELSEBEGINIF @INDEX_INCLUDE_KEYS IS NOT NULL AND @INDEX_INCLUDE_KEYS<> ''BEGINSET @CREATE_NON_INDEX_SQL =N'CREATE NONCLUSTERED INDEX ' + Char (9 )++ 'EI_' +@NONCLUSTERED_INDEX_NAME + Char (9) + ' ON ' + Char( 9)+ @TABLE + '(EI,' + @NON_INDEX_KEYS + ')INCLUDE(' + @INDEX_INCLUDE_KEYS + ')'ENDELSEBEGINSET @CREATE_NON_INDEX_SQL =N'CREATE NONCLUSTERED INDEX ' + Char (9 )++ 'EI_' +@NONCLUSTERED_INDEX_NAME + Char (9) + ' ON ' + Char( 9)+ @TABLE + '(EI,' + @NON_INDEX_KEYS + ')'ENDENDENDENDPRINT 4print @CREATE_NON_INDEX_SQLEXEC (@CREATE_NON_INDEX_SQL )SET @ERROR =@@ERROR + @ERRORSET @Y =@Y + 1ENDENDELSEBEGINCREATE NONCLUSTERED INDEX EI_PK_FeedPermission_Feed_EmployeeID ON FeedPermission(EI , FeedID , EmployeeID )CREATE NONCLUSTERED INDEX EI_IX_FeedPermission_EmployeeID_FeedID_InfoType ON FeedPermission(EI ,EmployeeID , FeedID , InfoType)ENDIF @ERROR = 0BEGINCOMMIT TRANSACTION TRA_NAMEENDIF @ERROR <> 0BEGINROLLBACK TRANSACTION TRA_NAMEENDDROP TABLE #ALL_INDEXSET NOCOUNT OFFEND

转载于:https://www.cnblogs.com/zhaowenzhong/p/5165450.html

批量修改在索引中增加字段相关推荐

  1. java sdo_geometry,批量修改oracle数据库中sdo_geometry字段的SRID

    1,在user_sdo_geom_metadata表中插入或者修改需要修改表的名称,表中的geometry字段名称和srid.具体可参考该表的字段. INSERT INTO USER_SDO_GEOM ...

  2. Tips--利用shell脚本批量提取txt文件中任意字段

    利用shell脚本批量提取txt文件中任意字段 前言 0. 一个例子 1. cat命令 2. '|'符号与'>'符号 3. grep命令 4. awk命令 前言 对于测试中出现的log,我们经常 ...

  3. ES中删除索引中某个字段

    ES中无法直接增删索引中的字段,只能能够覆盖,即重建新的索引 例:删除索引my_index中的source字段 先将source字段中的数据删除 否则后面reindex时,索引中会自动增加source ...

  4. mongo 改字段名_一日一技:修改MongoDB集合中的字段名

    一日一技:修改MongoDB集合中的字段名 一日一技是一个每天更新的栏目,旨在使用3分钟的时间让你每天都有新的进步. 在我们使用MongoDB的过程中,经常会出现修改数据的情况.我们一般使用 upda ...

  5. MySQL修改数据表中的字段名

    MySQL修改数据表中的字段名 在一张数据表中只能设置一个唯一名称的字段名.在同一张数据表中,不能出现两个名称完全相同的字段名. 因此,数据库系统可以通过字段名来区分数据表中的不同字段. 在MySQL ...

  6. 修改MYSQL 表中的字段属性

    1.登录数据库 >mysql -u root -p 数据库名称 2.查询所有数据表 >show tables; 3.查询表的字段信息 >desc 表名称; 4.1.修改某个表的字段类 ...

  7. 快速批量修改文件夹中图片的格式

    今天看到一个很不错的快速修改图片格式的方式,分享一下 快速批量修改文件夹中图片的格式 做图像处理的时候,需要将电脑文件夹中的图片格式批量修改,有一种不需要写代码的方法既可快速实现图片批量转换格式,具体 ...

  8. 批量修改文件夹中的名字/中文

    str.maketrans()方法只能进行一对一的映射,两个字符串的长度必须相同,不如replace方法灵活,例如以下,我把每个中文与其对应的拼音首字母对齐 详见博客:https://www.cnbl ...

  9. 如何批量修改文件夹中图片的后缀名

    原文链接: https://blog.csdn.net/lshcc01/article/details/95233258 如何批量修改文件夹中图片的后缀名 方法:编写脚本 1.在图片所在的文件夹里新建 ...

最新文章

  1. python爬虫专家_Python爬虫入门教程 27-100 微医挂号网专家团队数据抓取pyspider
  2. Python异常及处理方法总结
  3. SpringCloud注册中心高可用搭建
  4. 最新成果!超越AlphaZero!DeepMind让AI制霸「元宇宙」
  5. C语言丨线性表(一):顺序表
  6. python字符串二(find();index();count();rfind();rindex();replace();替换;.split();分割;join();合并)
  7. 三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数(day4)
  8. layer自动补全 select
  9. Sublime Text 3运行JavaScript控制台
  10. mysql 处理json_mysql存储过程处理json格式内容
  11. 单片机牛人的学习经历
  12. 计算机网络体系结构中的环节,ppt课件-第二章计算机网络体系结构.ppt
  13. 深入浅出计算机组成原理26-Superscalar和VLIW:如何让CPU的吞吐率超过1?
  14. 【Derivation】 条件数学期望公式
  15. 自动化测试:Selenium原理及安装教程
  16. Nginx负载均衡是酱紫做的
  17. 多目标人工秃鹫优化算法(MATLAB源码分享,智能优化算法) 提出了一种多目标版本的人工秃鹫优化算法(AVOA)
  18. 嵌入式学习(二)之SoC芯片的开发流程
  19. 小米5S TWRP刷面具、EdXposed
  20. 勤于奋:国外LEAD账号申请细节

热门文章

  1. [业界资讯]腾讯QQ同时在线用户数突破8000万
  2. python零基础入门大数据_【资源分享】零基础入门大数据(数据分析)经验分享...
  3. java程序实验总结_Java Socket 编程实验总结
  4. css面试基础知识,CSS知识点与面试题解析
  5. linux内核模块签名,如何签名内核模块Ubuntu 18.04
  6. android sco通信,android – startBluetoothSco()在ICS上抛出安全异常(BROADCAST_STICKY)
  7. emacs Linux Java编程环境_Linux下搭建用emacs查看代码的开发环境
  8. linux php mysql.so_在linux下php挂接mysql.so扩展的方法
  9. HALCON双目重建
  10. C++中如何访问全局变量和全局函数