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.