生成索引信息及自动创建脚本(Sql Server 2000)

标题生成索引信息及自动创建脚本

 

 

create proc p_helpindex

@tbname sysname ='' ,

@CLUSTERED int = '1'

as

--生成索引信息及索引创建脚本(Sql Server 2000)

--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]

 

*/

 

 

你可能感兴趣的:(MSSQL)