生成索引信息及索引创建脚本

create proc p_helpindex
@tbname sysname ='' ,
@CLUSTERED int = '1'
as
--生成索引信息及索引创建脚本
--
author : happyflystone
--
         Http://blog.csdn.net/happyflystone
--
@tbname 表名,空返回空
--
@CLUSTERED   是否显示聚集索引,1显示聚集索引,2不显示聚集索引
--
调用:p_helpindex 'dbo.customers','1'
--
转载请注明出处
if @tbname is null or @tbname = ''
   
return -1
declare @t table(
    table_name
nvarchar(100),
    schema_name
nvarchar(100),
    fill_factor
int,
    is_padded
int,
    ix_name
nvarchar(100),
    type
int,
    keyno
int,
    column_name
nvarchar(200),
    cluster
varchar(20),
    ignore_dupkey
varchar(20),
   
[unique] varchar(20),
    groupfile
varchar(10)
)
declare
   
@table_name nvarchar(100),
   
@schema_name nvarchar(100),
   
@fill_factor int,
   
@is_padded int,
   
@ix_name nvarchar(100),@ix_name_old nvarchar(100),
   
@type int,
   
@keyno int,
   
@column_name nvarchar(100),--@column_name_temp nvarchar(500),
    @cluster varchar(20),
   
@ignore_dupkey varchar(20),
   
@unique varchar(20),
   
@groupfile varchar(10)
declare ms_crs_ind cursor local static for
   
select
       
distinct table_name = a.name,
        schema_name
= b.name,
        fill_factor
= c.origfillfactor,
        is_padded
= case when c.status = 256 then 1 else 0 end,
        ix_name
= c.name,
        type
=  c.indid  , d.keyno,
        column_name
= e.name + case when  indexkey_property(a.id,c.indid, d.keyno, 'isdescending') =1 then ' desc ' else '' end,
       
case when (c.status & 16)<>0 then 'clustered' else 'nonclustered' end,
       
case when (c.status & 1) <>0 then  'IGNORE_DUP_KEY' else '' end,
       
case when (c.status & 2) <>0 then  'unique' else '' end ,
        g.groupname
   
from sysobjects a
   
inner join sysusers b on a.uid = b.uid
   
inner join sysindexes c on a.id = c.id
   
inner join sysindexkeys d on a.id = d.id and c.indid = d.indid
   
inner join syscolumns e on   a.id = e.id and d.colid = e.colid
   
inner join sysfilegroups g on g.groupid = c.groupid
   
left join master.dbo.spt_values f on f.number = c.status and f.type = 'I'
   
where a.id = object_id(@tbname) and c.indid < 255
         
and (c.status & 64)=0 and c.indid >= @CLUSTERED
   
order by c.indid,d.keyno

open ms_crs_ind
fetch ms_crs_ind into @table_name ,
   
@schema_name ,
   
@fill_factor,
   
@is_padded,
   
@ix_name,
   
@type ,
   
@keyno,
   
@column_name,
   
@cluster ,
   
@ignore_dupkey ,
   
@unique ,
   
@groupfile


if @@fetch_status < 0
begin
   
deallocate ms_crs_ind
   
raiserror(15472,-1,-1) --'Object does not have any indexes.'
    return -1
end
while @@fetch_status >= 0
begin
   
if exists(select 1 from @t where ix_name = @ix_name)
       
update @t
       
set column_name = column_name+','+@column_name
       
WHERE IX_NAME = @IX_NAME
   
else
       
insert into @t
       
select @table_name ,
       
@schema_name ,
       
@fill_factor,
       
@is_padded,
       
@ix_name,
       
@type ,
       
@keyno,
       
@column_name,
       
@cluster ,
       
@ignore_dupkey ,
       
@unique ,
       
@groupfile
   
fetch ms_crs_ind into @table_name ,
       
@schema_name ,
       
@fill_factor,
       
@is_padded,
       
@ix_name,
       
@type ,
       
@keyno,
       
@column_name,
       
@cluster ,
       
@ignore_dupkey ,
       
@unique ,
       
@groupfile

end
deallocate ms_crs_ind

select 'CREATE '+upper([unique])+
    
case when [unique] = '' then '' else ' ' end+upper(cluster)+' INDEX '+ix_name+' ON '+table_name+'('+column_name+')' +
    
case when fill_factor > 0 or is_padded = 1 or (upper(cluster) != 'NONCLUSTERED' and ignore_dupkey = 'IGNORE_DUP_KEY' )
    
then ' WITH '
       
+case when is_padded = 1 then 'PAD_INDEX,' else '' end
       
+case when fill_factor > 0 then 'FILLFACTOR ='+ltrim(fill_factor) else '' end
       
+case when ignore_dupkey = 'IGNORE_DUP_KEY' and upper(cluster) = 'NONCLUSTERED'
             
then case when  (fill_factor > 0 or is_padded = 1)
                  
then ',IGNORE_DUP_KEY' else ',IGNORE_DUP_KEY' end
             
else '' end
    
else '' end
+' ON ['+  groupfile+']' as col
from @t
return 0
go
--test
create table tb_test(id int,dept varchar(20))
go
CREATE UNIQUE CLUSTERED INDEX idx_6 ON tb_test(id) ON [PRIMARY]
CREATE NONCLUSTERED INDEX idx_1 ON tb_test(id) ON [PRIMARY]
CREATE NONCLUSTERED INDEX idx_2 ON tb_test(id) WITH PAD_INDEX,FILLFACTOR =90 ON [PRIMARY]
CREATE NONCLUSTERED INDEX idx_3 ON tb_test(id) WITH FILLFACTOR =90 ON [PRIMARY]
CREATE NONCLUSTERED INDEX idx_4 ON tb_test(id,dept) ON [PRIMARY]
CREATE NONCLUSTERED INDEX idx_5 ON tb_test(dept,id) ON [PRIMARY]
CREATE NONCLUSTERED INDEX idx_7 ON tb_test(id,dept desc ) ON [PRIMARY]
CREATE NONCLUSTERED INDEX idx_8 ON tb_test(id desc ,dept) ON [PRIMARY]
go

exec p_helpindex 'tb_test'
drop proc p_helpindex
drop table tb_test

/*

col
-------------------------------------------------------------------------------------
CREATE UNIQUE CLUSTERED INDEX idx_6 ON tb_test(id) ON [PRIMARY]
CREATE NONCLUSTERED INDEX idx_1 ON tb_test(id) ON [PRIMARY]
CREATE NONCLUSTERED INDEX idx_2 ON tb_test(id) WITH FILLFACTOR =90 ON [PRIMARY]
CREATE NONCLUSTERED INDEX idx_3 ON tb_test(id) WITH FILLFACTOR =90 ON [PRIMARY]
CREATE NONCLUSTERED INDEX idx_4 ON tb_test(id,dept) ON [PRIMARY]
CREATE NONCLUSTERED INDEX idx_5 ON tb_test(dept,id) ON [PRIMARY]
CREATE NONCLUSTERED INDEX idx_7 ON tb_test(id,dept desc ) ON [PRIMARY]
CREATE NONCLUSTERED INDEX idx_8 ON tb_test(id desc ,dept) ON [PRIMARY]

*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值