SQL Server 데이터베이스의 모든 데이터 삭제


129

내 데이터베이스의 모든 테이블에서 모든 레코드를 삭제하려면 어떻게해야합니까? 하나의 SQL 명령으로 수행 할 수 있습니까? 아니면 테이블 당 하나의 SQL 명령이 필요합니까?

답변:


194

SQLMenace의 솔루션은 .NET DELETE FROM대신 데이터 삭제 방법을 약간 조정하여 저에게 효과적 이었습니다 TRUNCATE.

-- disable referential integrity
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' 
GO 

EXEC sp_MSForEachTable 'DELETE FROM ?' 
GO 

-- enable referential integrity again 
EXEC sp_MSForEachTable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL' 
GO

Me To .. 삭제할 수 있었지만 자르지는 못했습니다.
— 마르셀

17
EXEC sp_MSForEachTable 'DBCC CHECKIDENT(''?'', RESEED, 0)'DELETE FROM 이후에 모든 ID 열을 다시 0으로 재설정 하는 것도 의미가 있습니다.
— Jonathan Amend

1
100 개의 delete 문을 대체하는 6 줄의 코드를 발견 한 날은 항상 좋은 시작입니다! 이 방법은 SQL 2014 Express에서 문제없이 작동합니다.
— Tommy

1
비활성화 트리거를 잊지 말라가 aswell
— 에드윈 Stoteler에게

10
오류가 발생했습니다- DELETE failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'.... 나를 위해 일했습니다 :EXEC sp_MSForEachTable 'SET QUOTED_IDENTIFIER ON; DELETE FROM ?'
— kasi

36

일반적으로 문서화되지 않은 proc sp_MSForEachTable을 사용합니다.

-- disable referential integrity
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' 
GO 

EXEC sp_MSForEachTable 'TRUNCATE TABLE ?' 
GO 

-- enable referential integrity again 
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL' 
GO

참고 항목 : 데이터베이스의 모든 데이터 삭제 (FK가있는 경우)


1
나는 이것이 작동하지 않는다고 생각한다. Kalen Delaney가 실수로이 아이디어를 시작한 것 같습니다. 여기서 그녀는 "테이블을 자르려면 참조 제약 조건을 삭제해야합니다."라고 설명합니다.
— Martin Smith

Martin 저는 2 초 전에 문제없이 Adventureworks DB에서 실행했습니다
— SQLMenace

여기서는 확실히 작동하지 않습니다. create database testing; GO use testing; create table t1 (i int primary key) create table t2(i int primary key,p int references t1)
— Martin Smith

2
답변으로 표시 되었음에도 불구하고 작동하지 않습니다. 외래 키에 nocheck 제약 조건을 설정하면 해당 테이블에서 자르기 명령을 실행할 수 없습니다. 잘리지 않는 오류가 계속 발생합니다.
— Fourth

3
이것은 외래 키의 존재로 인해 작동하지 않습니다. 그래도 왜 대답으로 받아 들여
— 졌는지 모르겠네요

19
/* Drop all non-system stored procs */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 ORDER BY [name])

WHILE @name is not null
BEGIN
    SELECT @SQL = 'DROP PROCEDURE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Procedure: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

/* Drop all views */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP VIEW [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped View: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

/* Drop all functions */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP FUNCTION [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Function: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

/* Drop all Foreign Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)

WHILE @name is not null
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint IS NOT NULL
    BEGIN
        SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint) +']'
        EXEC (@SQL)
        PRINT 'Dropped FK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop all Primary Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)

WHILE @name IS NOT NULL
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint is not null
    BEGIN
        SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint)+']'
        EXEC (@SQL)
        PRINT 'Dropped PK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop all tables */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP TABLE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Table: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

흥미로운 스크립트는 Azure에서 누락 된 관리되지 않은 저장된 proc 'sp_MSForEachTable'을 사용하지 않습니다. 하지만 [dbo]가 아닌 다른 스키마에 개체가있는 경우 조정이 필요합니다.
— Pac0

사용하십시오 gist.github.com/metaskills/893599을 푸른에 sp_MSForEachTable를 만들
— Harpal

16

나는 이것이 늦었다는 것을 알고 있지만, 테이블에서 데이터를 제거하는 번거 로움을 겪지 않고 데이터베이스를 스크립팅하라는 AlexKuznetsov의 제안에 동의합니다. 는 IF TRUNCATE솔루션을하지 작업, 당신은 많은 양의 데이터, 발행을 가지고 일어날 것입니다 (기록) DELETE문은 시간이 오래 걸릴 수 있습니다, 당신은 방법 (일반 시드되지 않은 식별자로 남아있을 것 INSERT와 함께 테이블에 문을 anIDENTITY 열은 당신에게 50000의 ID 대신에 하나의 ID)를 얻을 것입니다.

전체 데이터베이스를 스크립팅하려면 SSMS에서 데이터베이스를 마우스 오른쪽 버튼으로 클릭 한 다음 TASKS-> 를 선택합니다 Generate scripts.

여기에 이미지 설명 입력

Next마법사 시작 화면을 건너 뛰 려면 클릭 한 다음 스크립팅 할 개체를 선택합니다.

여기에 이미지 설명 입력

에서 Set scripting options화면, 당신은 개별 개체에 대한 모든 개체 또는 별도의 스크립트 1 스크립트를 생성 여부와 같은 스크립팅에 대한 설정을 선택할 수 있으며, 유니 코드 또는 ANSI 파일을 저장할지 여부를 :

여기에 이미지 설명 입력

마법사가 요약을 표시하여 원하는대로 모든 것을 확인하고 '마침'을 클릭하여 닫을 수 있습니다.


이 방법을 사용하면 "고급"버튼으로 이동하지 않으면 기본적으로 색인과 같은 항목이 손실됩니다.
— glautrou

6
  1. 먼저 모든 트리거를 비활성화해야합니다.

    sp_msforeachtable 'ALTER TABLE ? DISABLE TRIGGER all';
  2. 이 스크립트 실행 : (이 게시물 에서 가져온 @SQLMenace 감사합니다)

    SET NOCOUNT ON
    GO
    
    SELECT 'USE [' + db_name() +']';
    ;WITH a AS 
    (
         SELECT 0 AS lvl, 
                t.object_id AS tblID 
         FROM sys.TABLES t
         WHERE t.is_ms_shipped = 0
           AND t.object_id NOT IN (SELECT f.referenced_object_id 
                                   FROM sys.foreign_keys f)
    
         UNION ALL
    
         SELECT a.lvl + 1 AS lvl, 
                f.referenced_object_id AS tblId
         FROM a
         INNER JOIN sys.foreign_keys f ON a.tblId = f.parent_object_id 
                                       AND a.tblID <> f.referenced_object_id
    )
    SELECT 
        'Delete from ['+ object_schema_name(tblID) + '].[' + object_name(tblId) + ']' 
    FROM a
    GROUP BY tblId 
    ORDER BY MAX(lvl),1

이 스크립트는 DELETE적절한 순서로 문을 생성 합니다. 참조 된 테이블에서 시작하여 참조하는 테이블

  1. DELETE FROM명령문을 복사 하고 한 번 실행 하십시오 .

  2. 트리거 활성화

    sp_msforeachtable 'ALTER TABLE ? ENABLE TRIGGER all'
  3. 변경 사항을 커밋합니다.

    begin transaction
    commit;

이것은 나를 위해 작동하지 않으며 재귀 쿼리는 루프로 끝납니다. 아마도 자기 경외 때문일 것입니다.
— Edwin Stoteler

5

일반적으로 데이터베이스의 모든 개체를 스크립팅하고 테이블에서 삭제하거나자를 빈 개체를 만드는 것이 훨씬 빠릅니다.


3

SQL Server 데이터베이스에서 모든 데이터를 제거하는 데 사용한 스크립트 아래

------------------------------------------------------------
/* Use database */ 
-------------------------------------------------------------

use somedatabase;

GO

------------------------------------------------------------------
/* Script to delete an repopulate the base [init database] */
------------------------------------------------------------------

-------------------------------------------------------------
/* Procedure delete all constraints */ 
-------------------------------------------------------------

IF EXISTS (SELECT name  
           FROM  sysobjects 
           WHERE name = 'sp_DeleteAllConstraints' AND type = 'P')
    DROP PROCEDURE dbo.sp_DeleteAllConstraints
GO

CREATE PROCEDURE sp_DeleteAllConstraints
AS
    EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
    EXEC sp_MSForEachTable 'ALTER TABLE ? DISABLE TRIGGER ALL'
GO

-----------------------------------------------------
/* Procedure delete all data from the database */ 
-----------------------------------------------------

IF EXISTS (SELECT name  
           FROM  sysobjects 
           WHERE name = 'sp_DeleteAllData' AND type = 'P')
    DROP PROCEDURE dbo.sp_DeleteAllData
GO

CREATE PROCEDURE sp_DeleteAllData
AS
    EXEC sp_MSForEachTable 'DELETE FROM ?'
GO

-----------------------------------------------
/* Procedure enable all constraints */ 
-----------------------------------------------

IF EXISTS (SELECT name  
           FROM  sysobjects 
           WHERE name = 'sp_EnableAllConstraints' AND type = 'P')
    DROP PROCEDURE dbo.sp_EnableAllConstraints
GO
-- ....
-- ....
-- ....

1
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'

EXEC sp_MSForEachTable 'ALTER TABLE ? DISABLE TRIGGER ALL'

EXEC sp_MSForEachTable 'DELETE FROM ?'

EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'

EXEC sp_MSForEachTable 'ALTER TABLE ? ENABLE TRIGGER ALL'

EXEC sp_MSFOREACHTABLE 'SELECT * FROM ?'

GO

0

대안으로 Visual Studio SSDT 또는 Red Gate Sql Compare를 사용하는 경우 스키마 비교를 실행하고 스크립트를 작성하고 이전 데이터베이스를 삭제할 수 있습니다 (필요한 이유가있을 경우 먼저 백업을 만들 수 있습니다. 해당 데이터), 비교 도구에서 만든 스크립트로 새 데이터베이스를 만듭니다. 매우 작은 데이터베이스에서는 이것이 더 많은 작업 일 수 있지만, 매우 큰 데이터베이스에서는 데이터베이스를 삭제 한 다음 데이터베이스에있을 수있는 다양한 트리거 및 제약 조건을 처리하는 것이 훨씬 더 빠릅니다.


-1

예, 한 줄의 코드로 삭제할 수 있습니다.

SELECT 'TRUNCATE TABLE ' + d.NAME + ';' 
FROM   sys.tables d 
WHERE  type = 'U' 

이것은 각 테이블에 대한 자르기 문이있는 새 테이블을 제공합니다. 실제로 아무것도 삭제하지 않으며, 안타깝게도 먼저 제약 조건을 삭제하는 문제를 처리합니다. 안타깝게도 sp_MSForEachTable (나에게 존재하지 않는 Azure SQL Server)을 사용하지 않고 이와 같은 답변을 기대하고있었습니다.
— Pac0

예. 진실. 모든 테이블에 대한 자르기 스크립트 작성. 해당 스크립트를 사용하여 테이블 데이터를 삭제하십시오.
— Buddhika De Silva

이 솔루션은 테이블이 올바른 순서로 삭제되는 것을 보장 할 방법이 없기 때문에 관계가없는 경우에만 작동합니다. 또한 데이터 삭제에 대한 트리거가있는 경우 의도하지 않은 결과를 초래할 수 있습니다.
— dmoore1181
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.