How can I drop all indexes in a SQL database with one command?

前端 未结 7 1414
温柔的废话
温柔的废话 2021-02-04 00:01

So, how can I drop all indexes in a SQL database with one command? I have this command that will get me all the 20 or so drop statements, but how can I run all of those drop s

7条回答
  •  慢半拍i
    慢半拍i (楼主)
    2021-02-04 00:41

    None of the answers quite suited my needs.

    I needed one that will also drop indexes that backup unique or primary constraints (except if these can't be dropped as they back up a foreign key)

    DECLARE @SqlScript NVARCHAR(MAX);
    
    
    SELECT @SqlScript = 
    (
    SELECT 
    '
    BEGIN TRY
    '+ CASE WHEN 1 IN (i.is_primary_key, i.is_unique_constraint) THEN
     '
     ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(i.object_id)) + '.' + QUOTENAME(t.name)  + ' DROP CONSTRAINT ' + QUOTENAME(i.name) + ';'
    else
     '
     DROP INDEX ' + QUOTENAME(i.name)  + ' ON ' + QUOTENAME(OBJECT_SCHEMA_NAME(i.object_id)) + '.' + QUOTENAME(t.name)
     END+'
    
    END TRY
    BEGIN CATCH
    RAISERROR(''Could not drop %s on table %s'', 0,1, ' + QUOTENAME(i.name, '''') + ', ' + QUOTENAME(t.name, '''') + ')
    END CATCH
    '
    FROM sys.indexes i
    JOIN sys.tables t ON i.object_id = t.object_id
    WHERE i.type_desc IN ('CLUSTERED', 'NONCLUSTERED' )
    ORDER BY t.object_id, i.index_id DESC
    FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)');
    
    --Return script that will be run 
    SELECT @SqlScript AS [processing-instruction(x)]
    FOR XML PATH('');
    
    EXEC (@SqlScript);
    

提交回复
热议问题