您的位置:首页 > 数据库 > 数据库管理 > 正文

获取数据库中所有的索引信息

更多 时间:2016-2-18 类别:数据库 浏览量:475

获取数据库中所有的索引信息

获取数据库中所有的索引信息

SQL SERVER中数据库中所有的索引信息的方法

 

  •  
  • SQL 代码   复制
  • 
    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
                    where a.name<>'sysdiagrams'
            )
            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' else '' END AS IXUnique
                  ,case when a.ix_type_desc='CLUSTERED' then '聚集索引' when a.ix_type_desc='NONCLUSTERED' then '非聚集索引' else '' end as IXtype
                  ,a.ix_name  as IXName
                  ,a.object_id as TableId
                  ,a.table_name as TableName
                  ,indexColumns.ix_index_column_name as ColumnsName
                  ,IncludeIndex.ix_included_column_name as IncludeColumnsName
                  ,a.fg_name
                  ,a.is_primary_key
                  ,a.is_unique_constraint                                       
            FROM
            (
                    SELECT DISTINCT
                           ix_unique
                          ,ix_type_desc
                          ,object_id
                          ,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
    
    		
  •  

    例如

     

     

    标签:索引
    您可能感兴趣