[sql-server-2005] SQL Server 데이터베이스의 모든 테이블에서 모든 행을 삭제하는 방법은 무엇입니까?

SQL Server 데이터베이스의 모든 테이블에서 모든 행을 삭제하는 방법은 무엇입니까?



답변

참조 무결성이 설정되어 있으면 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


답변

최근 프로젝트에서 내 작업은 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'


답변

모든 행을 삭제하고 다음 스크립트로 수행했습니다.

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

도움이 되었기를 바랍니다!


답변

해결책은 다음과 같습니다.

  1. 제약 조건을 삭제합니다 ( 게시물 덕분에 )
  2. INFORMATION_SCHEMA.TABLES특정 데이터베이스에 대해 반복
  3. SELECTS 일부 검색 기준에 따른 테이블
  4. 해당 테이블에서 모든 데이터를 삭제합니다
  5. 구속 조건 다시 추가
  6. 같은 특정 테이블의 무시를 허용 sysdiagrams하고__RefactorLog

처음에 시도 EXECUTE sp_MSforeachtable 'TRUNCATE TABLE ?'했지만 다이어그램이 삭제되었습니다.

USE <DB name>;
GO

-- 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'

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
        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"


답변

제 경우에는 QUOTED_IDENTIFIER를 설정해야했습니다. 이로 인해 위의 Mark Rendle의 답변이 약간 수정되었습니다.

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


답변

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'


답변

Rubens 제안과 같은 접근 방식을 사용하여 모든 테이블에서 모든 행을 삭제하거나 모든 테이블을 삭제하고 다시 만들 수 있습니다. 어쨌든 가장 쉬운 / 빠른 방법이 될 수 있도록 전체 DB 작성 스크립트를 사용하는 것이 좋습니다.