[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