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
Post a Comment