Как удалить все строки из всех таблиц в базе данных SQL Server?

Как удалить все строки из всех таблиц в базе данных SQL Server?

Ответ 1

Обратите внимание, что TRUNCATE не будет работать, если у вас есть какая-либо ссылочная целостность.

В этом случае это будет работать:

EXEC sp_MSForEachTable 'DISABLE TRIGGER ALL ON ?'
GO
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO
EXEC sp_MSForEachTable 'DELETE FROM ?'
GO
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
GO
EXEC sp_MSForEachTable 'ENABLE TRIGGER ALL ON ?'
GO

Ответ 2

Мне пришлось удалить все строки и сделать это со следующим 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

Надеюсь, это поможет!

Ответ 3

В моем недавнем проекте моя задача состояла в том, чтобы очистить всю базу данных с помощью оператора sql и каждой таблицы, имеющей множество ограничений, таких как первичный ключ и внешний ключ. В базе данных содержится более 1000 таблиц, поэтому невозможно написать запрос на удаление для каждой таблицы.

Используя хранимую процедуру с именем sp_MSForEachTable, которая позволяет нам легко обрабатывать код по каждой таблице в одной базе данных. Это означает, что он используется для обработки одной команды T-SQL или разных команд T-SQL для каждой таблицы в базе данных.

Итак, выполните следующие шаги, чтобы обрезать все таблицы в базе данных SQL Server:

Шаг 1. Отключите все ограничения в базе данных, используя ниже sql-запрос:

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

Шаг 2. Выполните операцию "Удалить" или "обрезать" в каждой таблице базы данных, используя команду sql:

EXEC sys.sp_msforeachtable 'DELETE FROM ?'

Шаг 3. Включение всех ограничений в базе данных с помощью инструкции sql:

EXEC sys.sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'

Ответ 4

Вот решение, которое:

  • Итерирует через INFORMATION_SCHEMA.TABLES для конкретной базы данных
  • SELECTS таблицы, основанные на некоторых критериях поиска
  • Удаляет все данные из этих таблиц

Изначально я делал EXECUTE sp_MSforeachtable 'TRUNCATE TABLE ?', но это удалило мою таблицу диаграмм:( Она также должна работать с ограничениями this post.

USE <DB Name>;
GO

-- Disable all constraints in the database
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

DECLARE @tbl NVARCHAR(250);
DECLARE i CURSOR LOCAL FAST_FORWARD FOR SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME != 'sysdiagrams'

OPEN i;
FETCH NEXT FROM i INTO @tbl;

WHILE @@FETCH_STATUS = 0
    BEGIN
        DECLARE @sql NVARCHAR(MAX) = N'DELETE FROM [' + @tbl + '];'
        PRINT @sql -- Make sure these are the commands you want to execute, and then uncomment the 'EXECUTE' statement
        -- EXECUTE sys.sp_executesql @sql

        FETCH NEXT FROM i INTO @tbl;
    END

CLOSE i;
DEALLOCATE i;

-- Re-enable all constraints again
EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

Ответ 5

Set nocount on

Exec sp_MSForEachTable 'Alter Table ? NoCheck Constraint All'

Exec sp_MSForEachTable
'
If ObjectProperty(Object_ID(''?''), ''TableHasForeignRef'')=1
Begin
-- Just to know what all table used delete syntax.
Print ''Delete from '' + ''?''
Delete From ?
End
Else
Begin
-- Just to know what all table used Truncate syntax.
Print ''Truncate Table '' + ''?''
Truncate Table ?
End
'

Exec sp_MSForEachTable 'Alter Table ? Check Constraint All'

Ответ 6

Вы можете удалить все строки из всех таблиц с помощью подхода, предложенного Рубеном, или просто отбросить и воссоздать все таблицы. Всегда хорошая идея иметь полные скрипты создания db, так что это может быть самый простой/быстрый метод.

Ответ 7

если вы хотите удалить всю таблицу, вы должны следовать следующей инструкции SQL

Delete  FROM TABLE Where PRIMARY_KEY_ is Not NULL;

Ответ 8

Для некоторых требований нам, возможно, придется пропустить определенные таблицы. Я написал ниже script, чтобы добавить дополнительные условия для фильтрации списка таблиц. Ниже script также будет отображаться счетчик предварительного удаления и пост-удаления.

        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