Scripting Indexes in SQL 2000

DECLARE IndexCursor CURSOR FOR
SELECT OBJECT_NAME(SI.ID), SI.ID, SI.Name, SI.indid
FROM dbo.sysindexes SI
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC
ON SI.Name = TC.CONSTRAINT_NAME AND OBJECT_NAME(SI.ID) = TC.TABLE_NAME
WHERE TC.CONSTRAINT_NAME IS NULL
AND OBJECTPROPERTY(SI.ID, 'IsUserTable') = 1
AND INDEXPROPERTY( SI.[id], SI.[name], 'IsStatistics' ) = 0
AND OBJECT_NAME(SI.ID) in
(
'Table1',
'Table2'
)
ORDER BY OBJECT_NAME(SI.ID), SI.indid


DECLARE @IxTable varchar(50)
DECLARE @IxTableID INT
DECLARE @IxName varchar(50)
DECLARE @IxID INT

-- Loop through all indexes
OPEN IndexCursor
FETCH NEXT FROM IndexCursor INTO @IxTable, @IxTableID, @IxName, @IxID
WHILE (@@FETCH_STATUS = 0)
BEGIN
   DECLARE @IXSQL NVARCHAR(4000)

   SET @IXSQL = 'CREATE '

   -- Check if the index is unique
   IF (INDEXPROPERTY(@IxTableID, @IxName, 'IsUnique') = 1)
      SET @IXSQL = @IXSQL + 'UNIQUE '

   -- Check if the index is clustered
   IF (INDEXPROPERTY(@IxTableID, @IxName, 'IsClustered') = 1)
      SET @IXSQL = @IXSQL + 'CLUSTERED '

   SET @IXSQL = @IXSQL + 'INDEX ' + @IxName + ' ON [' + @IxTable + '] ('

   -- Get all columns of the index
   --DECLARE IndexCursorColumn CURSOR FOR
   --SELECT SC.Name,0,0
   --FROM dbo.sysindexkeys IC
   --JOIN dbo.syscolumns SC ON IC.ID = SC.ID AND IC.Column_ID = SC.Column_ID
   --WHERE IC.ID = @IxTableID AND indid = @IxID
   --ORDER BY IC.Index_Column_ID--,IC.is_included_column
   DECLARE IndexCursorColumn CURSOR FOR
   SELECT SC.Name,0,0
   FROM dbo.sysindexkeys IC
   JOIN dbo.syscolumns SC ON IC.ID = SC.ID AND IC.colid = SC.colid
   WHERE IC.ID = @IxTableID AND indid = @IxID
   ORDER BY IC.indid--,IC.is_included_column

   DECLARE @IxColumn varchar(50)
   DECLARE @IxIncl bit
   DECLARE @Desc bit
   DECLARE @IxIsIncl bit set @IxIsIncl = 0
   DECLARE @IxFirstColumn BIT SET @IxFirstColumn = 1

   -- Loop throug all columns of the index and append them to the CREATE statement
   OPEN IndexCursorColumn
   FETCH NEXT FROM IndexCursorColumn INTO @IxColumn, @IxIncl, @Desc
   WHILE (@@FETCH_STATUS = 0)
   BEGIN

      IF (@IxFirstColumn = 1)
            BEGIN
         SET @IxFirstColumn = 0
            END
      ELSE
            BEGIN
                  --check to see if it's an included column
                  IF ((@IxIsIncl = 0) AND (@IxIncl = 1))
                  BEGIN
                   SET @IxIsIncl = 1
                   SET @IXSQL = @IXSQL + ') INCLUDE ('
                  END
                  ELSE
                  BEGIN
                   SET @IXSQL = @IXSQL + ', '
                  END
            END

      SET @IXSQL = @IXSQL + '[' + @IxColumn + ']'
            --check to see if it's DESC
            IF @Desc = 1
                  SET @IXSQL = @IXSQL + ' DESC'

      FETCH NEXT FROM IndexCursorColumn INTO @IxColumn, @IxIncl, @Desc
   END
   CLOSE IndexCursorColumn
   DEALLOCATE IndexCursorColumn

   SET @IXSQL = @IXSQL + ')'
   -- Print out the CREATE statement for the index
   PRINT @IXSQL

   FETCH NEXT FROM IndexCursor INTO @IxTable, @IxTableID, @IxName, @IxID
END

CLOSE IndexCursor

DEALLOCATE IndexCursor

Comments

Popular posts from this blog

SSIS vs. T-SQL

Sync SSAS Cube From One Environment to Another

SQL Function to replace special characters from a string