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!