Amigos,
Cuantas veces nos encontramos ante una migración con la necesidad de contar con la ayuda de un script que nos permita scriptear todos los Indices de todas las tablas de una base de datos?
Estoy seguro que muchas veces se han efrentado a esta situación y, por cierto, no parece la situación ideal "pararse" sobre cada tabla y con el botón derecho scriptear cada uno de los idx...
Les dejo entonces un script que hace esto por ustedes, solo lo ejeutan y el resultado en formato texto será el script con el cual podrán regenerar uno a uno todos los índices de todas las tablas de una base de datos.
Aprovecho para saludar al amigo Agapito Buenaventura quien me ha escrito preguntando por este tema desde la querida Bolivia.
---------------------------------------------------------------------------
-- Autor Gustavo Herrera
-- Detalle: Este código scriptea todos los indices
correspondientes a una BD
-----------------------------------------------------------------------------
DECLARE cIX CURSOR FOR
SELECT
OBJECT_NAME(SI.Object_ID),
SI.Object_ID,
SI.Name,
SI.Index_ID,
F.NAME
FROM Sys.Indexes SI
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS
TC
ON
SI.Name = TC.CONSTRAINT_NAME AND
OBJECT_NAME(SI.Object_ID) = TC.TABLE_NAME
LEFT JOIN sys.filegroups f -- para saber el filegroup
ON SI.data_space_id = f.data_space_id
WHERE --TC.CONSTRAINT_NAME IS NULL --AND
OBJECTPROPERTY(SI.Object_ID, 'IsUserTable') = 1
ORDER
BY OBJECT_NAME(SI.Object_ID), SI.Index_ID
DECLARE
@IxTable SYSNAME,
@IxTableID INT,
@IxName SYSNAME,
@IxID INT,
@PKSQL varchar (50),
@FILEGROUP VARCHAR (50)
-- Loopea a través de todos los idx
OPEN cIX
FETCH NEXT FROM cIX INTO
@IxTable,
@IxTableID, @IxName,
@IxID, @FILEGROUP
WHILE (@@FETCH_STATUS = 0)
BEGIN
DECLARE
@IXSQL NVARCHAR(4000) SET @PKSQL = ''
SET
@IXSQL = 'CREATE '
-- Chequea si el indice es unique
IF
(INDEXPROPERTY(@IxTableID, @IxName, 'IsUnique') = 1)
SET
@IXSQL = @IXSQL +
'UNIQUE '
-- Chequea si el idx es clustered
IF
(INDEXPROPERTY(@IxTableID, @IxName, 'IsClustered') = 1)
SET
@IXSQL = @IXSQL +
'CLUSTERED '
SET
@IXSQL = @IXSQL +
'INDEX ' +
@IxName + ' ON '
+ @IxTable + '('
-- Obtiene todas
las columnas que contienen índices
DECLARE cIxColumn CURSOR FOR
SELECT SC.Name
FROM Sys.Index_Columns IC
JOIN Sys.Columns SC ON IC.Object_ID = SC.Object_ID AND IC.Column_ID = SC.Column_ID
WHERE IC.Object_ID =
@IxTableID AND Index_ID = @IxID
ORDER BY IC.Index_Column_ID
DECLARE
@IxColumn SYSNAME,
@IxFirstColumn BIT
SET @IxFirstColumn =
1
-- Loopea a
través de todas las columnas que forman un idx y les agrega un CREATE
OPEN cIxColumn
FETCH NEXT FROM cIxColumn INTO
@IxColumn
WHILE (@@FETCH_STATUS = 0)
BEGIN
IF (@IxFirstColumn = 1)
SET @IxFirstColumn =
0
ELSE
SET @IXSQL = @IXSQL + ', '
SET @IXSQL = @IXSQL + @IxColumn
FETCH NEXT FROM cIxColumn INTO
@IxColumn
END
CLOSE cIxColumn
DEALLOCATE cIxColumn
SET @IXSQL = @IXSQL + ') '+'ON '+@FILEGROUP
-- Imprime
CREATE statement para los índices
PRINT @IXSQL
FETCH NEXT FROM cIX INTO @IxTable,
@IxTableID, @IxName,
@IxID, @FILEGROUP
END
CLOSE cIX
DEALLOCATE cIX