SQL SERVER 2005 获取表的所有索引信息以及删除和新建语句

BEGIN
        WITH tx AS
        (
                SELECT a.object_id
                      ,b.name AS schema_name
                      ,a.name AS table_name
                      ,c.name as ix_name
                      ,c.is_unique AS ix_unique
                      ,c.type_desc AS ix_type_desc
                      ,d.index_column_id
                      ,d.is_included_column
                      ,e.name AS column_name
                      ,f.name AS fg_name
                      ,d.is_descending_key AS is_descending_key
                      ,c.is_primary_key
                      ,c.is_unique_constraint
                  FROM sys.tables AS a
                 INNER JOIN sys.schemas AS b            ON a.schema_id = b.schema_id AND a.is_ms_shipped = 0
                 INNER JOIN sys.indexes AS c            ON a.object_id = c.object_id
                 INNER JOIN sys.index_columns AS d      ON d.object_id = c.object_id AND d.index_id = c.index_id
                 INNER JOIN sys.columns AS e            ON e.object_id = d.object_id AND e.column_id = d.column_id
                 INNER JOIN sys.data_spaces AS f        ON f.data_space_id = c.data_space_id
        )
        SELECT
               Drop_Index   = CASE WHEN (a.is_primary_key = 1 OR a.is_unique_constraint = 1)
                                   THEN ‘ALTER TABLE ‘ + a.table_name + ‘ DROP CONSTRAINT ‘ + a.ix_name
                                   ELSE ‘DROP INDEX ‘ + a.ix_name collate SQL_Latin1_General_CP1_CI_AS + ‘ ON ‘ + a.schema_name + ‘.‘ + a.table_name  END
              ,Create_Index = CASE WHEN (a.is_primary_key = 1 OR a.is_unique_constraint = 1)
                                   THEN ‘ALTER TABLE ‘ + a.table_name + ‘ ADD CONSTRAINT ‘ + a.ix_name 
                                       + CASE WHEN a.is_primary_key = 1 THEN ‘ PRIMARY KEY‘ ELSE ‘ UNIQUE‘ END + ‘(‘ + indexColumns.ix_index_column_name + ‘)‘
                                   ELSE ‘CREATE ‘ + CASE WHEN a.ix_unique = 1 THEN ‘UNIQUE ‘ ELSE ‘‘ END 
                                       + a.ix_type_desc + ‘ INDEX ‘ + a.ix_name collate SQL_Latin1_General_CP1_CI_AS + ‘ ON ‘ + a.schema_name
                                       + ‘.‘ + a.table_name + ‘(‘ + indexColumns.ix_index_column_name + ‘)‘
                                       + CASE WHEN IncludeIndex.ix_included_column_name IS NOT NULL THEN ‘ INCLUDE (‘ + IncludeIndex.ix_included_column_name + ‘)‘ ELSE ‘‘ END
                                       + ‘ ON [‘ + a.fg_name +‘]‘ END
              ,CASE WHEN a.ix_unique = 1 THEN ‘UNIQUE‘ END AS ix_unique
              ,a.ix_type_desc
              ,a.ix_name
              ,a.schema_name
              ,a.table_name
              ,indexColumns.ix_index_column_name
              ,IncludeIndex.ix_included_column_name
              ,a.fg_name
              ,a.is_primary_key
              ,a.is_unique_constraint                                       
        FROM
        (
                SELECT DISTINCT
                       ix_unique
                      ,ix_type_desc
                      ,ix_name
                      ,schema_name
                      ,table_name
                      ,fg_name
                      ,is_primary_key
                      ,is_unique_constraint
                  FROM tx
        ) AS a
        OUTER APPLY
        (
                SELECT ix_index_column_name
                       = STUFF((
                                SELECT ‘,‘ + column_name + CASE WHEN is_descending_key = 1 THEN ‘ DESC‘ ELSE ‘‘ END
                                  FROM tx AS b
                                 WHERE schema_name = a.schema_name
                                   AND table_name=a.table_name
                                   AND ix_name=a.ix_name
                                   AND ix_type_desc=a.ix_type_desc
                                   AND fg_name=a.fg_name
                                   AND is_included_column=0
                                 ORDER BY index_column_id
                                   FOR XML PATH(‘‘)
                                ),1,1,‘‘)
        )IndexColumns
        OUTER APPLY
        (
                SELECT ix_included_column_name
                       = STUFF((
                                SELECT ‘,‘ + column_name
                                  FROM tx AS b
                                 WHERE schema_name = a.schema_name
                                   AND table_name=a.table_name
                                   AND ix_name=a.ix_name
                                   AND ix_type_desc=a.ix_type_desc
                                   AND fg_name=a.fg_name
                                   AND is_included_column=1
                                 ORDER BY index_column_id
                                   FOR XML PATH(‘‘)
                                ), 1,1,‘‘)
        )IncludeIndex
        ORDER BY a.schema_name,a.table_name,a.ix_name;
END

时间: 2024-11-08 21:21:26

SQL SERVER 2005 获取表的所有索引信息以及删除和新建语句的相关文章

SQL Server 2005中的分区表(四):删除(合并)一个分区

在前面我们介绍过如何创建和使用一个分区表,并举了一个例子,将不 同年份的数据放在不同的物理分区表里.具体的分区方式为: 第1个小表:2010-1-1以前的数据(不包含2010-1-1). 第2个小表:2010-1-1(包含2010-1-1)到2010-12-31之间的数据. 第3个小表:2011-1-1(包含2011-1-1)到2011-12-31之间的数据. 第4个小表:2012-1-1(包含2012-1-1)到2012-12-31之间的数据. 第5个小表:2013-1-1(包含2013-1-

SQL Server 2005中的分区表(四):删除(合并)一个分区(转)

在前面我们介绍过如何创建和使用一个分区表,并举了一个例子,将不 同年份的数据放在不同的物理分区表里.具体的分区方式为: 第1个小表:2010-1-1以前的数据(不包含2010-1-1). 第2个小表:2010-1-1(包含2010-1-1)到2010-12-31之间的数据. 第3个小表:2011-1-1(包含2011-1-1)到2011-12-31之间的数据. 第4个小表:2012-1-1(包含2012-1-1)到2012-12-31之间的数据. 第5个小表:2013-1-1(包含2013-1-

SQL SERVER中获取表间主外键关系

sql server 2008中的主外键关系获取方式: 转自:http://www.cnblogs.com/ke10/archive/2012/06/11/2544655.html SELECT OBJECT_NAME(con.constid) '关系名' ,OBJECT_NAME(sf.fkeyid) '主键表' ,fcol.name '主键' ,OBJECT_NAME(sf.rkeyid) '外键表' ,rcol.name '外键',st.name'数据类型'FROM sysforeignk

sql server 2008获取表的字段注释

1 SELECT 2 表名=case when a.colorder=1 then d.name else '' end, 3 表说明=case when a.colorder=1 then isnull(f.value,'') else '' end, 4 字段序号=a.colorder, 5 字段名=a.name, 6 标识=case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end, 7 主键=case

SQL Server 查看一个表上的索引

方法:1 sys.indexes index_id =0:堆 index_id =1:聚集索引 index_id =2.....:非聚集索引 ------------------------------------------------------------------------------------- 例子: create table Student(ID int not null,Name nvarchar(16),Major nvarchar(16));go create inde

SQL Server 2005中的分区表(六):将已分区表转换成普通表

在前面,我们介绍过怎么样直接创建一个分区表,也介绍过怎么将一个普通表转换成一个分区表.那么,这两种方式创建的表有什么区别呢?现在,我又最新地创建了两个表: 第一个表名为Sale,这个表使用的是<SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?>中的方法创建的,在创建完之后,还为该表添加了一个主键. 第二个表名Sale1,这个表使用的是<SQL Server 2005中的分区表(三):将普通表转换成分区表>中的方法创建的,也就是先创建了

SQL Server 2005中的分区表

记录笔记: 转自 猪八戒学做网站 SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表? SQL Server 2005中的分区表(二):如何添加.查询.修改分区表中的数据 SQL Server 2005中的分区表(三):将普通表转换成分区表 SQL Server 2005中的分区表(四):删除(合并)一个分区 SQL Server 2005中的分区表(五):添加一个分区 SQL Server 2005中的分区表(六):将已分区表转换成普通表 SQL S

删除指定表的所有索引,包括主键索引,唯一索引和普通索引 ,适用于sql server 2005,

原文:删除指定表的所有索引,包括主键索引,唯一索引和普通索引 ,适用于sql server 2005, --删除指定表中所有索引 --用法:declare @tableName varchar(100) --set @tableName='表名' --表名 ,根据实际情况替换 --exec sp_dropindex @tableName if exists(select 1 from sysobjects where id = object_id('dropindex') and xtype =

SQL Server 2005中的分区表(三):将普通表转换成分区表(转)

在设计数据库时,经常没有考虑到表分区的问题,往往在数据表承重的负担越来越重时,才会考虑到分区方式,这时,就涉及到如何将普通表转换成分区表的问题了. 那么,如何将一个普通表转换成一个分区表 呢?说到底,只要将该表创建一个聚集索引,并在聚集索引上使用分区方案即可. 不过,这回说起来简单,做起来就复杂了一点.还是接着上面的例子,我们先使用以下SQL语句将原有的Sale表删除. --删除原来的数据表 drop table Sale 然后使用以下SQL语句创建一个新的普通表,并在这个表里插入一些数据. -