createproc p_helpindex @tbname sysname ='' ,@typechar(1) ='1' as --生成索引信息及索引创建脚本 --author : nzperfect --@tbname 表名,空返回所有表索引 --@type 是否显示聚集索引,1显示聚集索引,2不显示聚集索引 --调用:p_helpindex 'dbo.customers','1' with t as ( select rank() over (orderby b.name,a.name,c.name) as id,c.index_id, b.name as schema_name,a.name as table_name,c.fill_factor,c.is_padded, c.name as ix_name,c.type,e.name as column_name,d.index_column_id,c.is_primary_key, d.is_included_column,f.name asfilegroup_name,c.is_unique,c.ignore_dup_key, d.is_descending_key as is_descending_key,c.allow_row_locks,c.allow_page_locks from sys.tables as a innerjoin sys.schemas as b on a.schema_id=b.schema_id and a.is_ms_shipped=0 innerjoin sys.indexes as c on a.object_id=c.object_id innerjoin sys.index_columns as d on d.object_id=c.object_idand d.index_id=c.index_id innerjoin sys.columns as e on e.object_id=d.object_idand e.column_id=d.column_id innerjoin sys.data_spaces as f on f.data_space_id=c.data_space_id where a.object_idlike'%'+isnull(ltrim(object_id(@tbname)),'')+'%' and c.is_hypothetical=0and is_disabled=0and c.type>=@type ) selectdistinct a.schema_name,a.table_name,a.ix_name, case a.type when1then'clustered'when2then'nonclustered'else''endas index_type, case a.is_primary_key when0then'no'else'yes'endas is_primary_key, m.ix_index_column_name,isnull(m.ix_index_include_column_name,'') as ix_index_include_column_name, a.filegroup_name,replace('create '+casewhen is_unique=1then'unique 'else''end +casewhen a.type=1then'clustered'else'nonclustered'end+' index ' + a.ix_name+' on '+a.schema_name+'.'+a.table_name+'('+m.ix_index_column_name+')' +casewhen m.ix_index_include_column_name isnullthen''else'include('+m.ix_index_include_column_name+')'end +casewhen fill_factor>0or ignore_dup_key=1or is_padded=1or allow_row_locks=0or allow_page_locks=0then'with('else''end +casewhen fill_factor>0then',fillfactor='+rtrim(fill_factor) else''end +casewhen is_padded=1then',pad_index=on'else''end +casewhen ignore_dup_key=1then',ignore_dup_key=on'else''end +casewhen allow_row_locks=0then',allow_row_locks=off'else''end +casewhen allow_page_locks=0then',allow_page_locks=off'else''end +casewhen fill_factor>0or ignore_dup_key=1or is_padded=1or allow_row_locks=0or allow_page_locks=0then')'else''end,'with(,','with(') as sqlscript from t as a outer apply ( select ix_index_column_name=stuff(replace(replace( ( selectcasewhen b.is_descending_key =1then column_name +' desc'else column_name endas column_name from t as b where a.id=b.id and is_included_column=0orderby index_column_id for xml auto ), '<b column_name="', ','), '"/>', ''), 1, 1, '') ,ix_index_include_column_name=stuff(replace(replace( ( select column_name from t as b where a.id=b.id and is_included_column=1 orderby index_column_id for xml auto ), '<e column_name="', ','), '"/>', ''), 1, 1, '') )m orderby a.schema_name,a.table_name,a.ix_name
测试:
createdatabase db_test go use db_test go createtable tb(id intprimarykey,col_1 varchar(20),col_2 varchar(30),col_3 varchar(30)) go insertinto tb select1,'a','b','c' go createindex ix_01 on tb(col_1) createindex ix_03 on tb(col_1,col_2 desc) createindex ix_02 on tb(col_1)include(col_2)with(fillfactor=80,pad_index=on) createuniqueindex ix_04 on tb(col_1,col_3)include(col_2)with(ignore_dup_key=on) go --执行这个脚本的结果 p_helpindex tb /**//*--生成的创建脚本 create nonclustered index ix_01 on dbo.tb(col_1) create nonclustered index ix_02 on dbo.tb(col_1)include(col_2)with(fillfactor=80,pad_index=on) create nonclustered index ix_03 on dbo.tb(col_1,col_2 desc) create unique nonclustered index ix_04 on dbo.tb(col_1,col_3)include(col_2)with(ignore_dup_key=on) create unique clustered index PK__tb__7C8480AE on dbo.tb(id) */