terça-feira, 7 de junho de 2011

Script para gerar INDEXES que não são constraints

Dando continuidade aos procedimentos que estava executando de recriação de um Database em um outro servidor, precisei gerar apenas os índices de query (índices que não são constraints). Encontrei este script no SQL SERVER CENTRAL, e fiz algumas alterações. Como estou com uma situação meio urgente (como sempre), acabei não alterando algumas coisas mais gritantes como o fato do script fazer uso de sysindexes e não as views do 2005/2008 como sys.indexes, mas pelo menos adicionei alguns comentários, e uma quebra de linha e um ‘GO’ para melhorar a legibilidade do código, portanto para melhor utilização do script, mudem a visualização dos resultados para TEXT.

 

Outra coisa, se no seu banco de dados tiver índices com muuuitas colunas, mude a configuração do Management Studio, em TOOLS => Options => Query Results  => Results to text e altere o valor do campo “Maximum number of characters displayed in each column” para um valor beemmm alto.

 

Prometo que faço uma re-leitura deste post com uma versão mais “atual” do script (isso se meus queridos leitores não se anteciparem encaminhando uma nova versão...alguém??..).

 

Segue o script:

 

 

SELECT         Replicate(' ', 4000)                            AS colnames,

               Object_name(i.id)                               AS tablename,

               i.id                                            AS tableid,

               i.indid                                         AS indexid,

               i.name                                          AS indexname,

               i.status,

               Indexproperty (i.id, i.name, 'ISUNIQUE')        AS isunique,

               Indexproperty (i.id, i.name, 'ISCLUSTERED')     AS isclustered,

               Indexproperty (i.id, i.name, 'INDEXFILLFACTOR') AS

               indexfillfactor

INTO   #tmp

FROM   sysindexes i

WHERE  i.indid > 0

       AND i.indid < 255

       AND (i.status & 64) = 0

         --Comentar/Descomentar as linhas abaixo para

         --desconsiderar PKs e FKs

         AND      INDEXPROPERTY(I.ID,I.NAME,'ISUNIQUE') = 0

         AND   INDEXPROPERTY(I.ID,I.NAME,'ISCLUSTERED') = 0

 

DECLARE @ISQL           VARCHAR(MAX),

        @TABLEID        INT,

        @INDEXID        INT,

        @MAXTABLELENGTH INT,

        @MAXINDEXLENGTH INT

 

--USED FOR FORMATTING ONLY

SELECT @MAXTABLELENGTH = MAX(Len(tablename))

FROM   #tmp

 

SELECT @MAXINDEXLENGTH = MAX(Len(indexname))

FROM   #tmp

 

DECLARE c1 CURSOR FOR

  SELECT tableid,

         indexid

  FROM   #tmp

 

OPEN c1

 

FETCH NEXT FROM c1 INTO @TABLEID, @INDEXID

 

WHILE @@FETCH_STATUS <> -1

  BEGIN

      SET @ISQL = ''

 

      SELECT @ISQL = @ISQL + Isnull(syscolumns.name, '') + ','

      FROM   sysindexes i

             INNER JOIN sysindexkeys

               ON i.id = sysindexkeys.id

                  AND i.indid = sysindexkeys.indid

             INNER JOIN syscolumns

               ON sysindexkeys.id = syscolumns.id

                  AND sysindexkeys.colid = syscolumns.colid

      WHERE  i.indid > 0

             AND i.indid < 255

             AND ( i.status & 64 ) = 0

             AND i.id = @TABLEID

             AND i.indid = @INDEXID

      ORDER  BY syscolumns.colid

 

      UPDATE #tmp

      SET    colnames = @ISQL

      WHERE  tableid = @TABLEID

             AND indexid = @INDEXID

 

      FETCH NEXT FROM c1 INTO @TABLEID, @INDEXID

  END

 

CLOSE c1

DEALLOCATE c1

 

--ATÉ ESTE PONTO, O COLNAMES TEM UMA VIRGULA NO FINAL...

UPDATE #tmp

SET    colnames = LEFT(colnames, Len(colnames) - 1)

 

SELECT CAST('CREATE ' + CASE

                     WHEN isunique = 1 THEN ' UNIQUE '

                     ELSE '        '

                   END + CASE

                           WHEN isclustered = 1 THEN ' CLUSTERED '

                           ELSE '           '

                         END + ' INDEX [' + Upper(indexname) + ']' + Space(

              @MAXINDEXLENGTH - Len(indexname)) + ' ON [' + Upper(tablename) +

       '] ' +

              Space(@MAXTABLELENGTH - Len(tablename)) + '(' + Upper(colnames)  +

       ')' +

              CASE

              WHEN indexfillfactor = 0 THEN ''

              ELSE ' WITH FILLFACTOR = ' + CONVERT(VARCHAR(10), indexfillfactor)

              END + CHAR(13) + CHAR(10) +'GO' AS VARCHAR(MAX)) --AS SQL

FROM   #tmp

 

--SELECT * FROM #TMP

DROP TABLE #tmp 

 

Abs e até a próxima!

Nenhum comentário:

Postar um comentário

Leave your comment here!