How to delete all rows from all tables in a SQL Server database?

前端 未结 11 1195
遇见更好的自我
遇见更好的自我 2020-11-29 15:12

How to delete all rows from all tables in a SQL Server database?

11条回答
  •  没有蜡笔的小新
    2020-11-29 15:25

    --Load tables to delete from
    SELECT 
    DISTINCT
    ' Delete top 1000000 from ..' + c.TABLE_NAME + ' WHERE ' AS query,c.TABLE_NAME AS TableName, IsDeleted=0, '' AS [Source]--,t.TABLE_TYPE, c.*
                INTO dbo.AllTablesToDeleteFrom
                FROM INFORMATION_SCHEMA.TABLES AS t
                INNER JOIN information_schema.columns c ON c.TABLE_NAME = t.TABLE_NAME 
        WHERE c.COLUMN_NAME = ''
               AND c.TABLE_SCHEMA = 'dbo'
               AND c.TABLE_CATALOG = ''
               AND t.TABLE_TYPE='Base table'
               --AND t.TABLE_NAME LIKE ''
    
                DECLARE @TableSelect NVARCHAR(1000)= '';
                DECLARE @Table NVARCHAR(1000)= '';
                DECLARE @IsDeleted INT= 0;
                DECLARE @NumRows INT = 1000000;
                DECLARE @Source NVARCHAR(50)='';
    
    
                WHILE ( @IsDeleted = 0 )
                    BEGIN
                    --This grabs one table at a time to be deleted from. @TableSelect has the sql to execute. it is important to order by IsDeleted ASC
                    --because it will pull tables to delete from by those that have a 0=IsDeleted first. Once the loop grabs a table with IsDeleted=1 then this will pop out of loop
    
                        SELECT TOP 1
                                @TableSelect = query,
                                @IsDeleted = IsDeleted,
                                @Table = TableName,
                                @Source=[a].[Source]
                        FROM    dbo.AllTablesToDeleteFrom a
                        WHERE a.[Source]='SomeDescriptorHere'--use only if needed
                        ORDER BY a.IsDeleted ASC;--this is required because only those records returned with IsDeleted=0 will run through loop
    
                        --SELECT  @Table; can add this in to  monitor what table is being deleted from
    
                        WHILE ( @NumRows = 1000000 )--only delete a million rows at a time?
    
                        BEGIN 
                        EXEC sp_executesql @TableSelect;
                        SET @NumRows = @@ROWCOUNT;
                        --IF @NumRows = 1000000 --can do something here if needed
                        --One wants this loop to continue as long as a million rows is deleted. Once < 1 million rows is deleted it pops out of loop
                        --and grabs next table to delete
                        --    BEGIN
                        --SELECT  @NumRows;--can add this in to see current number of deleted records for table
                                INSERT  INTO dbo.DeleteFromAllTables
                                        ( tableName,
                                          query,
                                          cnt,
                                          [Source]
                                        )
                                SELECT  @Table,
                                        @TableSelect,
                                        @NumRows,
                                        @Source;
                         --   END; 
                    END; 
    
    
    
    SET @NumRows = 1000000;
    
    UPDATE  a
    SET     a.IsDeleted = 1
    FROM    dbo.AllTablesToDeleteFrom a
    WHERE   a.TableName = @Table;
    --flag this as deleted so you can move on to the next table to delete from
    
    END; 
    

提交回复
热议问题