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

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

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

相关标签:
11条回答
  • 2020-11-29 15:39

    This answer builds on Zach Smith's answer by resetting the identity column as well:

    1. Disabling all constraints
    2. Iterating through all tables except those you choose to exclude
    3. Deletes all rows from the table
    4. Resets the identity column if one exists
    5. Re-enables all constraints

    Here is the query:

    -- Disable all constraints in the database
    EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
    
    declare @catalog nvarchar(250);
    declare @schema nvarchar(250);
    declare @tbl nvarchar(250);
    DECLARE i CURSOR LOCAL FAST_FORWARD FOR select
                                            TABLE_CATALOG,
                                            TABLE_SCHEMA,
                                            TABLE_NAME
                                            from INFORMATION_SCHEMA.TABLES
                                            where
                                            TABLE_TYPE = 'BASE TABLE'
                                            AND TABLE_NAME != 'sysdiagrams'
                                            AND TABLE_NAME != '__RefactorLog'
                                            -- Optional
                                            -- AND (TABLE_SCHEMA = 'dbo')
    
    OPEN i;
    FETCH NEXT FROM i INTO @catalog, @schema, @tbl;
    WHILE @@FETCH_STATUS = 0
        BEGIN
            DECLARE @sql NVARCHAR(MAX) = N'DELETE FROM [' + @catalog + '].[' + @schema + '].[' + @tbl + '];'
            /* Make sure these are the commands you want to execute before executing */
            PRINT 'Executing statement: ' + @sql
            --EXECUTE sp_executesql @sql
    
            -- Reset identity counter if one exists
            IF ((SELECT OBJECTPROPERTY( OBJECT_ID(@catalog + '.' + @schema + '.' + @tbl), 'TableHasIdentity')) = 1)
            BEGIN
                SET @sql = N'DBCC CHECKIDENT ([' + @catalog + '.' + @schema + '.' + @tbl + '], RESEED, 0)'
                PRINT 'Executing statement: ' + @sql
                --EXECUTE sp_executesql @sql
            END     
    
            FETCH NEXT FROM i INTO @catalog, @schema, @tbl;
        END
    CLOSE i;
    DEALLOCATE i;
    
    -- Re-enable all constraints again
    EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
    
    0 讨论(0)
  • 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
    
    0 讨论(0)
  • 2020-11-29 15:45

    You could delete all the rows from all tables using an approach like Rubens suggested, or you could just drop and recreate all the tables. Always a good idea to have the full db creation scripts anyway so that may be the easiest/quickest method.

    0 讨论(0)
  • 2020-11-29 15:47

    I had to delete all the rows and did it with the next script:

    DECLARE @Nombre NVARCHAR(MAX);
    DECLARE curso CURSOR FAST_FORWARD 
    FOR 
    Select Object_name(object_id) AS Nombre from sys.objects where type = 'U'
    
    OPEN curso
    FETCH NEXT FROM curso INTO @Nombre
    
    WHILE (@@FETCH_STATUS <> -1)
    BEGIN
    IF (@@FETCH_STATUS <> -2)
    BEGIN
    DECLARE @statement NVARCHAR(200);
    SET @statement = 'DELETE FROM ' + @Nombre;
    print @statement
    execute sp_executesql @statement;
    END
    FETCH NEXT FROM curso INTO @Nombre
    END
    CLOSE curso
    DEALLOCATE curso
    

    Hope this helps!

    0 讨论(0)
  • 2020-11-29 15:48

    In my recent project my task was to clean an entire database by using sql statement and each table having many constraints like Primary Key and Foreign Key. There are more than 1000 tables in database so its not possible to write a delete query on each and ever table.

    By using a stored procedure named sp_MSForEachTable which allows us to easily process some code against each and every table in a single database. It means that it is used to process a single T-SQL command or a different T-SQL commands against every table in the database.

    So follow the below steps to truncate all tables in a SQL Server Database:

    Step 1- Disable all constraints on the database by using below sql query :

    EXEC sys.sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'

    Step 2- Execute a Delete or truncate operation on each table of the database by using below sql command :

    EXEC sys.sp_msforeachtable 'DELETE FROM ?'
    

    Step 3- Enable all constraints on the database by using below sql statement:

    EXEC sys.sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
    
    0 讨论(0)
提交回复
热议问题