2010-03-01 9 views
2

Je suis sur le point d'écrire un script pour ajouter de nouveaux index à une base de données, je souhaite que ce script fonctionne indépendamment des index courants de la base de données.Comment supprimer tous les index de base de données d'une base de données SQL Server

Par conséquent, la première étape du script devrait être de supprimer tous les index actuels. (Je pourrais tout aussi bien exécuter le code .net, mais je pense que TSQL sera moins douloureux pour ce genre de choses)

(Ceci est à utiliser dans le développement de petites bases de données, donc ça ne me dérange pas si ce n'est pas le moyen le plus rapide de gérer les index, cela doit fonctionner pour SqlServer 2005 et SqlServer 2008)

Répondre

6

J'ai trouvé ceci à http://refactormycode.com/codes/522-drop-all-indexes-in-sql-server. Il semble supprimer tous les index dans la base de données actuelle:

Declare @Index varchar(128) 
Declare @Table varchar(128) 

Select 
SysIndexes.Name As 'Index', 
SysObjects.Name As 'Table' 
Into 
#Indexes 
From 
SysIndexes 
Inner Join SysObjects On 
    SysObjects.id = SysIndexes.id 
Where 
SysIndexes.Name Is Not Null 
and SysObjects.XType = 'U' 
Order By 
SysIndexes.Name, 
SysObjects.Name 

While (Select Count(*) From #Indexes) > 0 
Begin 
    Set @Index = (Select Top 1 [Index] From #Indexes) 
    Set @Table = (Select Top 1 [Table] From #Indexes) 

    --Print 'Drop Index [' + @Index + '] On [' + @Table + ']' + Char(13) 
    Exec ('Drop Index [' + @Index + '] On [' + @Table + ']') 
    Delete From #Indexes Where [Index] = @Index and [Table] = @Table 
End 

Drop Table #Indexes 
+0

merci, il me donne Une DROP INDEX explicite est pas autorisée sur l'indice 'Application.PK_dbo.Application' . Il est utilisé pour l'application des contraintes PRIMARY KEY. (Peut-être que ce que je demande n'est pas possible) –

+0

Je pense que vous devriez supprimer la contrainte de clé primaire pour supprimer les index PK. Vous pouvez utiliser quelque chose comme ... 'ALTER TABLE TableName DROP CONSTRAINT pk_Name'. Rappelez-vous que cela affectera l'intégrité référentielle. – Dolbz

1

Un autre script de travail:

http://blogs.msdn.com/b/tihot/archive/2006/01/16/513548.aspx 


    DECLARE @indexName NVARCHAR(128) 
    DECLARE @dropIndexSql NVARCHAR(4000) 


    DECLARE tableIndexes CURSOR FOR 
    SELECT name FROM sysindexes 
    WHERE id = OBJECT_ID(N'tableName') AND 
     indid > 0 AND indid < 255 AND 
     INDEXPROPERTY(id, name, 'IsStatistics') = 0 
    ORDER BY indid DESC 


    OPEN tableIndexes 
    FETCH NEXT FROM tableIndexes INTO @indexName 
    WHILE @@fetch_status = 0 
    BEGIN 
     SET @dropIndexSql = N'DROP INDEX tableName.' + @indexName 
     EXEC sp_executesql @dropIndexSql 

     FETCH NEXT FROM tableIndexes INTO @indexName 
    END 


    CLOSE tableIndexes 
    DEALLOCATE tableIndexes 
Questions connexes