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

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

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

11条回答
  •  栀梦
    栀梦 (楼主)
    2020-11-29 15:42

    For some requirements we might have to skip certain tables. I wrote the below script to add some extra conditions to filter the list of tables. The below script will also display the pre delete count and post delete count.

            IF OBJECT_ID('TEMPDB..#TEMPRECORDCOUNT') IS NOT NULL 
            DROP TABLE #TEMPRECORDCOUNT 
    
            CREATE TABLE #TEMPRECORDCOUNT 
                (    TABLENAME NVARCHAR(128)
                    ,PREDELETECOUNT BIGINT
                    ,POSTDELETECOUNT BIGINT
                ) 
    
            INSERT INTO #TEMPRECORDCOUNT (TABLENAME, PREDELETECOUNT, POSTDELETECOUNT)
    
            SELECT   O.name TableName
                    ,DDPS.ROW_COUNT PREDELETECOUNT
                    ,NULL  FROM sys.objects O 
    
            INNER JOIN (
    
                        SELECT OBJECT_ID, SUM(row_count) ROW_COUNT 
                        FROM SYS.DM_DB_PARTITION_STATS
                        GROUP BY OBJECT_ID
                       ) DDPS ON DDPS.OBJECT_ID = O.OBJECT_ID
            WHERE O.type = 'U' AND O.name NOT LIKE 'OC%' AND O.schema_id = 1
    
            DECLARE @TableName NVARCHAR(MAX);
            DECLARE TableDeleteCursor CURSOR FAST_FORWARD 
            FOR 
            SELECT TableName from #TEMPRECORDCOUNT
    
            OPEN TableDeleteCursor
            FETCH NEXT FROM TableDeleteCursor INTO @TableName
    
            WHILE (@@FETCH_STATUS <> -1)
            BEGIN
            IF (@@FETCH_STATUS <> -2)
            BEGIN
            DECLARE @STATEMENT NVARCHAR(MAX);
            SET @STATEMENT = ' DISABLE TRIGGER ALL ON ' + @TableName + 
                             '; ALTER TABLE ' + @TableName + ' NOCHECK CONSTRAINT ALL' +
                             '; DELETE FROM ' + @TableName +
                             '; ALTER TABLE ' + @TableName + ' CHECK CONSTRAINT ALL' +
                             '; ENABLE TRIGGER ALL ON ' + @TableName;
            PRINT @STATEMENT
            EXECUTE SP_EXECUTESQL @STATEMENT;
            END
            FETCH NEXT FROM TableDeleteCursor INTO @TableName
            END
            CLOSE TableDeleteCursor
            DEALLOCATE TableDeleteCursor
    
            UPDATE T 
             SET T.POSTDELETECOUNT = I.ROW_COUNT 
             FROM #TEMPRECORDCOUNT T 
             INNER JOIN (
                            SELECT O.name TableName, DDPS.ROW_COUNT ROW_COUNT  
                            FROM sys.objects O 
                            INNER JOIN (
    
                                    SELECT OBJECT_ID, SUM(row_count) ROW_COUNT 
                                    FROM SYS.DM_DB_PARTITION_STATS
                                    GROUP BY OBJECT_ID
                                   ) DDPS ON DDPS.OBJECT_ID = O.OBJECT_ID
                            WHERE O.type = 'U' AND O.name NOT LIKE 'OC%' AND O.schema_id = 1
    
                        ) I ON I.TableName COLLATE DATABASE_DEFAULT = T.TABLENAME 
    
            SELECT * FROM #TEMPRECORDCOUNT 
            ORDER BY TABLENAME ASC
    

提交回复
热议问题