Technical Article

Generate Index for Foreign Keys

,

This script generate spool with create index for all foreign key.

/*
Nombre del procedimiento:CREAIND
Elaborado por:Norman Dario Higuita Montoya
Fecha de elaboración:12/02/2004
Descripción:Genera los scripts de creación de los indices de las llaves foraneas
Modificado por:Ryan Berrio Cardona
email:                          rbcardona@hotmail.com
Descripción:Se le agregar que permita generar los indices de las llaves foraneas compuestas
 
*/-- Declaracion de variables
DECLARE @lintidllave numeric  (18,0)
DECLARE @lstrnombllave varchar (40)
DECLARE @lintfkeyid numeric (18,0)
DECLARE @lintcolufkeyid1 numeric (18,0)
DECLARE @lintcolufkeyid2 numeric (18,0)
DECLARE @lintcolufkeyid3 numeric (18,0)
DECLARE @lintcolufkeyid4 numeric (18,0)
DECLARE @lintcolufkeyid5 numeric (18,0)
DECLARE @lintcolufkeyid6 numeric (18,0)
DECLARE @lintcolufkeyid7 numeric (18,0)
DECLARE @lintcolufkeyid8 numeric (18,0)
DECLARE @lintcolufkeyid9 numeric (18,0)
DECLARE @lintcolufkeyid10 numeric (18,0)
DECLARE @lintcolufkeyid11 numeric (18,0)
DECLARE @lintcolufkeyid12 numeric (18,0)
DECLARE @lintcolufkeyid13 numeric (18,0)
DECLARE @lintcolufkeyid14 numeric (18,0)
DECLARE @lintcolufkeyid15 numeric (18,0)
DECLARE @lintcolufkeyid16 numeric (18,0)
DECLARE @lintcuanto numeric(5)
DECLARE @lstrnombTablF varchar (40)
DECLARE @lstrnombColuTablF varchar (40)
DECLARE @lstrnombIndi varchar(1000)
DECLARE @lstrnombCamp varchar(1000)
DECLARE @lintcontad numeric(5)

-- Declaracion de cursos que extrae los ID de las llaves foranes
DECLARE cLlaves CURSOR FOR
SELECT     id, name
FROM        sysobjects 
WHERE    xtype = 'F'
ORDER BY name

-- Abre cursor
OPEN cLlaves

-- Extrae la primera fila
FETCH NEXT FROM cLlaves into @lintidllave, @lstrnombllave

-- Ciclo de repeticion 
WHILE @@FETCH_STATUS = 0
BEGIN
-- Extrae los ID de las llaves foranes
-- Busca los ID de las tablas que hacen la relacion 

DECLARE cTablasLlaves CURSOR FOR
SELECT    fkeyid
FROM       sysforeignkeys
WHERE    constid = @lintidllave

-- Abre cursor

OPEN cTablasLlaves
FETCH NEXT FROM cTablasLlaves into @lintfkeyid
CLOSE cTablasLlaves
DEALLOCATE cTablasLlaves

-- Busca con el ID de la Llave los numero de columna que estan asociados en la llave por tabla
DECLARE cNumeColuLlaves CURSOR FOR
SELECT    fkey1, fkey2, fkey3, fkey4, fkey5, fkey6, fkey7, fkey8, fkey9, fkey10, fkey11, fkey12, fkey13, fkey14, fkey15, fkey16
FROM       sysreferences
WHERE    constid = @lintidllave
--AND          keycnt = 1

-- Abre cursor
OPEN cNumeColuLlaves
FETCH NEXT FROM cNumeColuLlaves into @lintcolufkeyid1, @lintcolufkeyid2, @lintcolufkeyid3, @lintcolufkeyid4, 
@lintcolufkeyid5, @lintcolufkeyid6, @lintcolufkeyid7, @lintcolufkeyid8, @lintcolufkeyid9, 
@lintcolufkeyid10, @lintcolufkeyid11, @lintcolufkeyid12, @lintcolufkeyid13, @lintcolufkeyid14, 
@lintcolufkeyid15, @lintcolufkeyid16

IF  @@FETCH_STATUS = 0 
BEGIN
-- Extrae el nombre del dos Tablas F y R
SET @lstrnombTablF = ( SELECT name  FROM sysobjects WHERE id = @lintfkeyid)

-- Se inicializan las variables para recorrer la llave foranea
SET @lintcontad = 1
SET @lstrnombIndi = ''
SET @lstrnombCamp = ''

-- Extrae el nombre de los nombre de los campos de las  dos Tablas F y R
-- Se recupera cada uno de los nombre de los campos que componen la llave forenea

IF @lintcolufkeyid1 <> 0
BEGIN
SET @lstrnombColuTablF = (SELECT name FROM syscolumns WHERE id = @lintfkeyid and colid = @lintcolufkeyid1 )
SET @lstrnombIndi = @lstrnombColuTablF
SET @lstrnombCamp = @lstrnombColuTablF
END

IF @lintcolufkeyid2 <> 0
BEGIN
SET @lstrnombColuTablF = (SELECT name FROM syscolumns WHERE id = @lintfkeyid and colid = @lintcolufkeyid2 )
SET @lstrnombIndi = @lstrnombIndi + '_' + @lstrnombColuTablF
SET @lstrnombCamp = @lstrnombCamp + ', ' + @lstrnombColuTablF
END

IF @lintcolufkeyid3 <> 0
BEGIN
SET @lstrnombColuTablF = (SELECT name FROM syscolumns WHERE id = @lintfkeyid and colid = @lintcolufkeyid3 )
SET @lstrnombIndi = @lstrnombIndi + '_' + @lstrnombColuTablF
SET @lstrnombCamp = @lstrnombCamp + ', ' + @lstrnombColuTablF
END

IF @lintcolufkeyid4 <> 0
BEGIN
SET @lstrnombColuTablF = (SELECT name FROM syscolumns WHERE id = @lintfkeyid and colid = @lintcolufkeyid4 )
SET @lstrnombIndi = @lstrnombIndi + '_' + @lstrnombColuTablF
SET @lstrnombCamp = @lstrnombCamp + ', ' + @lstrnombColuTablF
END

IF @lintcolufkeyid5 <> 0
BEGIN
SET @lstrnombColuTablF = (SELECT name FROM syscolumns WHERE id = @lintfkeyid and colid = @lintcolufkeyid5 )
SET @lstrnombIndi = @lstrnombIndi + '_' + @lstrnombColuTablF
SET @lstrnombCamp = @lstrnombCamp + ', ' + @lstrnombColuTablF
END

IF @lintcolufkeyid6 <> 0
BEGIN
SET @lstrnombColuTablF = (SELECT name FROM syscolumns WHERE id = @lintfkeyid and colid = @lintcolufkeyid6 )
SET @lstrnombIndi = @lstrnombIndi + '_' + @lstrnombColuTablF
SET @lstrnombCamp = @lstrnombCamp + ', ' + @lstrnombColuTablF
END

IF @lintcolufkeyid7 <> 0
BEGIN
SET @lstrnombColuTablF = (SELECT name FROM syscolumns WHERE id = @lintfkeyid and colid = @lintcolufkeyid7 )
SET @lstrnombIndi = @lstrnombIndi + '_' + @lstrnombColuTablF
SET @lstrnombCamp = @lstrnombCamp + ', ' + @lstrnombColuTablF
END

IF @lintcolufkeyid8 <> 0
BEGIN
SET @lstrnombColuTablF = (SELECT name FROM syscolumns WHERE id = @lintfkeyid and colid = @lintcolufkeyid8 )
SET @lstrnombIndi = @lstrnombIndi + '_' + @lstrnombColuTablF
SET @lstrnombCamp = @lstrnombCamp + ', ' + @lstrnombColuTablF
END

IF @lintcolufkeyid9 <> 0
BEGIN
SET @lstrnombColuTablF = (SELECT name FROM syscolumns WHERE id = @lintfkeyid and colid = @lintcolufkeyid9 )
SET @lstrnombIndi = @lstrnombIndi + '_' + @lstrnombColuTablF
SET @lstrnombCamp = @lstrnombCamp + ', ' + @lstrnombColuTablF
END

IF @lintcolufkeyid10 <> 0
BEGIN
SET @lstrnombColuTablF = (SELECT name FROM syscolumns WHERE id = @lintfkeyid and colid = @lintcolufkeyid10 )
SET @lstrnombIndi = @lstrnombIndi + '_' + @lstrnombColuTablF
SET @lstrnombCamp = @lstrnombCamp + ', ' + @lstrnombColuTablF
END

IF @lintcolufkeyid11 <> 0
BEGIN
SET @lstrnombColuTablF = (SELECT name FROM syscolumns WHERE id = @lintfkeyid and colid = @lintcolufkeyid11 )
SET @lstrnombIndi = @lstrnombIndi + '_' + @lstrnombColuTablF
SET @lstrnombCamp = @lstrnombCamp + ', ' + @lstrnombColuTablF
END

IF @lintcolufkeyid12 <> 0
BEGIN
SET @lstrnombColuTablF = (SELECT name FROM syscolumns WHERE id = @lintfkeyid and colid = @lintcolufkeyid12 )
SET @lstrnombIndi = @lstrnombIndi + '_' + @lstrnombColuTablF
SET @lstrnombCamp = @lstrnombCamp + ', ' + @lstrnombColuTablF
END

IF @lintcolufkeyid13 <> 0
BEGIN
SET @lstrnombColuTablF = (SELECT name FROM syscolumns WHERE id = @lintfkeyid and colid = @lintcolufkeyid13 )
SET @lstrnombIndi = @lstrnombIndi + '_' + @lstrnombColuTablF
SET @lstrnombCamp = @lstrnombCamp + ', ' + @lstrnombColuTablF
END

IF @lintcolufkeyid14 <> 0
BEGIN
SET @lstrnombColuTablF = (SELECT name FROM syscolumns WHERE id = @lintfkeyid and colid = @lintcolufkeyid14 )
SET @lstrnombIndi = @lstrnombIndi + '_' + @lstrnombColuTablF
SET @lstrnombCamp = @lstrnombCamp + ', ' + @lstrnombColuTablF
END

IF @lintcolufkeyid15 <> 0
BEGIN
SET @lstrnombColuTablF = (SELECT name FROM syscolumns WHERE id = @lintfkeyid and colid = @lintcolufkeyid15 )
SET @lstrnombIndi = @lstrnombIndi + '_' + @lstrnombColuTablF
SET @lstrnombCamp = @lstrnombCamp + ', ' + @lstrnombColuTablF
END

IF @lintcolufkeyid16 <> 0
BEGIN
SET @lstrnombColuTablF = (SELECT name FROM syscolumns WHERE id = @lintfkeyid and colid = @lintcolufkeyid16 )
SET @lstrnombIndi = @lstrnombIndi + '_' + @lstrnombColuTablF
SET @lstrnombCamp = @lstrnombCamp + ', ' + @lstrnombColuTablF
END

-- Spool con la creación de los indices.
PRINT ' CREATE NONCLUSTERED INDEX  ' + @lstrnombTablF + '_' + @lstrnombIndi + '_IX '  +  ' ON ' + @lstrnombTablF + ' ( ' + @lstrnombCamp + ' ) ON [PRIMARY] '
           END
           CLOSE cNumeColuLlaves
           DEALLOCATE cNumeColuLlaves


   -- Lee el proximo registro
  FETCH NEXT FROM cLlaves into @lintidllave, @lstrnombllave
-- Fin Ciclo de lectura
END
-- Cierra el cursor de requerimientos
CLOSE cLlaves
DEALLOCATE cLlaves
GO

Rate

You rated this post out of 5. Change rating

Share

Share

Rate

You rated this post out of 5. Change rating