February 22, 2012

Save All Indexes metadata of your database

Searching in my old vault of scripts I found a project where we needed to save all the indexes of a database in a table. Now is very easy to do the same process using smo instead of sql scripts or just using SSMS, but, this is a good example of how things used to be....
if not exists ( select * from sysobjects where ID =object_id(N'tblDBAIdxMetadt') and ObjectProperty(ID,'IsTable')=1)
CREATE TABLE [dbo].[tblDBAIdxMetadt](
    [TableId] [int] NOT NULL,
    [SchemaOwner] [varchar](25) NOT NULL,
    [TableName] [varchar](255) NOT NULL,
    [IndexID] [int] NOT NULL,
    [IsStatistics] [bit] NOT NULL DEFAULT ('FALSE'),
    [IsClustered] [bit] NOT NULL DEFAULT ('FALSE'),
    [IndexName] [varchar](255) NOT NULL,
    [ClusterType] [varchar](50) NOT NULL,
    [UniqueType] [varchar](50) NULL,
    [IndexType] [varchar](50) NULL,
    [AllColName] [varchar](2000) NULL
) ON [PRIMARY]

GO

DECLARE @MyID int
        ,@TableName varchar(255)
set @TableName = ---TableName Here            
SET @MyID = (SELECT OBJECT_ID(@TableName,'U')) 

INSERT INTO [dbo].[tblDBAIdxMetadt]
           ([TableId]
           ,[SchemaOwner]
           ,[TableName]
           ,[IndexID]
           ,[IsStatistics]
           ,[IsClustered]
           ,[IndexName]
           ,ClusterType
           ,[UniqueType]
           ,[IndexType]
           ,[AllColName])
SELECT
obj.id AS TableID
,usr.name Owner
,obj.name TableName
,idx.Indid AS IndexID
,CASE
 WHEN (idx.STATUS & 64) <> 0 THEN 1
 ELSE 0 end as IsStatistics
,Case idx.indid
  when 1 then 1
  else 0 end as IsClustered
 , CASE idx.name
  WHEN obj.name THEN '** NONE **'
 ELSE idx.name END AS IndexName,
  CASE idx.indid
  WHEN 1 THEN 'CLUSTERED'
  WHEN 0 THEN 'HEAP'
   ELSE 'NONCLUSTERED' END AS ClusterType,
            CASE
               WHEN (idx.status & 2048) > 0 THEN 'PRIMARY KEY'
                  WHEN (idx.status & (2|4096)) > 0 THEN 'UNIQUE'
             
            ELSE '' END AS UniqueType,
         CASE      
                  WHEN (idx.status & (2048)) > 0
                              OR ((idx.status & (4096)) > 0 )
                        THEN 'CONSTRAINT'
                  WHEN idx.indid = 0 THEN ' '
            ELSE 'INDEX' END AS IndexType,

            CASE      
                  WHEN INDEX_COL(usr.name+'.'+ QUOTENAME(obj.name), idx.indid, 1) IS NULL THEN ''
            ELSE '['+ INDEX_COL(usr.name+'.'+QUOTENAME(obj.name), idx.indid, 1)+']' END +
      CASE      
                  WHEN INDEX_COL(usr.name+'.'+ QUOTENAME(obj.name), idx.indid, 2) IS NULL THEN ''
            ELSE ',['+INDEX_COL(usr.name+'.'+QUOTENAME(obj.name), idx.indid,2)+']' END +
            CASE      
                  WHEN INDEX_COL(usr.name+'.'+QUOTENAME(obj.name), idx.indid, 3) IS NULL THEN ''
            ELSE ',['+INDEX_COL(usr.name+'.'+QUOTENAME(obj.name), idx.indid,3)+']' END +
         CASE      
                  WHEN INDEX_COL(usr.name+'.'+QUOTENAME(obj.name), idx.indid, 4) IS NULL THEN ''
            ELSE ',['+INDEX_COL(usr.name+'.'+QUOTENAME(obj.name), idx.indid,4)+']' END +
            CASE      
                  WHEN INDEX_COL(usr.name+'.'+ QUOTENAME(obj.name), idx.indid, 5) IS NULL THEN ''
            ELSE ',['+INDEX_COL(usr.name+'.'+QUOTENAME(obj.name), idx.indid,5)+']' END +
      CASE      
                  WHEN INDEX_COL(usr.name+'.'+QUOTENAME(obj.name), idx.indid, 6) IS NULL THEN ''
            ELSE ',['+INDEX_COL(usr.name+'.'+QUOTENAME(obj.name), idx.indid,6)+']' END +
      CASE      
                  WHEN INDEX_COL(usr.name+'.'+QUOTENAME(obj.name), idx.indid, 7) IS NULL THEN ''
            ELSE ',['+INDEX_COL(usr.name+'.'+QUOTENAME(obj.name), idx.indid, 7)+']' END +
      CASE      
                  WHEN INDEX_COL(usr.name+'.'+QUOTENAME(obj.name), idx.indid, 8) IS NULL THEN ''
            ELSE ',['+INDEX_COL(usr.name+'.'+QUOTENAME(obj.name), idx.indid,8)+']' END +
      CASE      
                  WHEN INDEX_COL(usr.name+'.'+ QUOTENAME(obj.name), idx.indid, 9) IS NULL THEN ''
            ELSE ',['+INDEX_COL(usr.name+'.'+QUOTENAME(obj.name), idx.indid,9)+']' END +
      CASE      
                  WHEN INDEX_COL(usr.name+'.'+ QUOTENAME(obj.name), idx.indid, 10) IS NULL THEN ''
            ELSE ',['+INDEX_COL(usr.name+'.'+QUOTENAME(obj.name), idx.indid,10)+']' END +
      CASE      
                  WHEN INDEX_COL(usr.name+'.'+ QUOTENAME(obj.name), idx.indid, 11) IS NULL THEN ''
            ELSE ',['+INDEX_COL(usr.name+'.'+QUOTENAME(obj.name), idx.indid,11)+']' END +
      CASE      
                  WHEN INDEX_COL(usr.name+'.'+ QUOTENAME(obj.name), idx.indid, 12) IS NULL THEN ''
            ELSE ',['+INDEX_COL(usr.name+'.'+QUOTENAME(obj.name), idx.indid,12)+']' END +
      CASE      
                  WHEN INDEX_COL(usr.name+'.'+ QUOTENAME(obj.name), idx.indid, 13) IS NULL THEN ''
            ELSE ',['+INDEX_COL(usr.name+'.'+QUOTENAME(obj.name), idx.indid,13)+']' END +
      CASE      
                  WHEN INDEX_COL(usr.name+'.'+ QUOTENAME(obj.name), idx.indid, 14) IS NULL THEN ''
            ELSE ',['+INDEX_COL(usr.name+'.'+QUOTENAME(obj.name), idx.indid,14)+']' END +
      CASE      
                  WHEN INDEX_COL(usr.name+'.'+ QUOTENAME(obj.name), idx.indid, 15) IS NULL THEN ''
            ELSE ',['+INDEX_COL(usr.name+'.'+QUOTENAME(obj.name), idx.indid,15)+']' END +
      CASE      
                  WHEN INDEX_COL(usr.name+'.'+ QUOTENAME(obj.name), idx.indid, 16) IS NULL THEN ''
          ELSE ',['+INDEX_COL(usr.name+'.'+QUOTENAME(obj.name), idx.indid,16)+']' END AS AllColName
    

 FROM sysobjects obj (NOLOCK)
      LEFT OUTER JOIN sysindexes idx (NOLOCK)
            ON obj.id = idx.id
     JOIN sysusers usr (NOLOCK)
            ON obj.uid = usr.uid
 WHERE obj.type = 'U' AND idx.indid < 255
 AND obj.name NOT IN ('dtproperties')
AND idx.name  NOT LIKE '_WA_Sys_%'
And obj.id = @MyID --Removed if want to query all tables
end

No comments:

Post a Comment

Contact Form

Name

Email *

Message *