[MSSQL] - Gerando script para criação de índices

Criei o comando abaixo para facilitar a criação/replicação de índices de uma base para outra. Usei o recurso de "xml path" para criar a lista dinâmica das colunas dos índices, evitando assim a necessidade de uso de cursor ou bloco TSQL. Acabei no final por criar um sub-select utilizando o comando "replace" para remover a última vírgula que ficou no final do comando gerado. Confesso que não ficou muito elegante, mas funcionou. Segue abaixo como ficou:
SELECT REPLACE(comando,',)',')')
FROM   (SELECT 'create INDEX '
        + i.name + ' on ' 
        + t.name + ' (' 
        + (SELECT   c.name + ','
           FROM     sys.index_columns ic,
                    sys.columns c
           WHERE    ic.object_id = t.object_id
             AND ic.index_id = i.index_id
             AND c.object_id = t.object_id
             AND c.column_id = ic.column_id
           ORDER BY ic.column_id
           FOR XML PATH('')) + ')' 

        + char(10) 
        + 'GO' AS comando
        FROM   sys.indexes i,
               sys.tables t
        WHERE  i.object_id = t.object_id
        AND i.name IS NOT NULL

       ) indices
A saída do comando deve ficar semelhante a esta aqui:
CREATE INDEX kesmovime_log1 ON esmovime_log (movimento)
GO
CREATE INDEX kesmovime_log2 ON esmovime_log (dt_movimento)
GO
CREATE INDEX kesmovime_log3 ON esmovime_log (dt_movimento,cd_material)
GO
CREATE INDEX pk_esmovime_log ON esmovime_log (id)
GO
CREATE INDEX pk_log_esregraf ON log_esregraf (id)

GO

Desta forma fica fácil gerarmos um script com todos os índices da base para criação posterior, ou replicação e revisão de outra base que não possua todos os índices.

Obs.: Troque a saída do comando acima no Enterprise Management Studio, de planilha para texto, assim as quebras de linha ficam corretas e o comando funcionará adequadamente.

Fiz tempos atrás um script semelhante a este em Oracle, porém em forma de procedure utilizando cursores. Ele está disponível aqui no blog neste link.

Comentários

Postagens mais visitadas deste blog

[Openfire] - Ajuste de horário no cliente Spark

Verificar uso de disco em partição ASM do Oracle 11g no Linux

[Kettle] - Ajuste de Memória de Utilização