SQL Serverデータベースのすべてのデータを削除する


回答:


194

SQLMenaceのソリューションは、データが削除される方法に若干の微調整と私のために働いた- 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)'0に戻って、すべてのID列をリセットするためにFROM DELETE後
ジョナサンは改正

1
何百ものdeleteステートメントに代わる6行のコードを見つけたその日は、常に良いスタートです!この方法は、SQL 2014 Expressでは問題なく機能します。
トミー

1
同様に

10
エラーが発生しました- DELETE failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'...。私にとっては:EXEC sp_MSForEachTable 'SET QUOTED_IDENTIFIER ON; DELETE FROM ?'
kasi

36

通常は、ドキュメントに記載されていないプロシージャ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私は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)
マーティン・スミス

2
答えとしてマークされているにもかかわらず、これは機能しません。外部キーにnocheck制約を設定すると、それらのテーブルで切り捨てコマンドを実行できなくなります。それでも、切り捨てを妨げるエラーが発生します。
第四に

3
外部キーが存在するため、これは機能しません。それでも答えとして受け入れられた理由はわかりません:/
mounaim

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にはない、拡張されていないストアドプロシージャ 'sp_MSForEachTable'を利用していません。ただし、[dbo]以外のスキーマにオブジェクトがある場合は、調整が必要です。
Pac0 2018年

Azureでsp_MSForEachTableを作成するには、gist.github.com / metaskills / 893599を使用してください
Harpal

16

私はこれが遅いことを知っていますが、テーブルからデータをパージする手間を省くのではなく、データベースをスクリプト化するというAlexKuznetsovの提案に同意します。もしTRUNCATE解決策が機能しません、あなたは(ログイン)を発行、大量のデータを持って起こるDELETE(すなわち文は長い時間がかかるかもしれない、とあなたが再播種されていない識別子に残されますINSERTと、テーブルに文をIDENTITY列は)あなたの代わりに、1のIDの50000のIDを取得することになります。

データベース全体をスクリプト化するには、SSMSでデータベースを右クリックし、[ TASKS-> ]を選択しますGenerate scripts

ここに画像の説明を入力してください

Nextウィザードの開始画面をクリックしてスキップし、スクリプトを作成するオブジェクトを選択します。

ここに画像の説明を入力してください

ではSet scripting options画面には、個々のオブジェクトのすべてのオブジェクト、または別のスクリプトの1つのスクリプトを生成するかどうかのように、スクリプトの設定を選ぶことができ、およびUnicodeまたは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 2016年

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

はい、1行のコードで削除できます

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

これにより、各テーブルの切り捨てステートメントを含む新しいテーブルが得られます。実際には何も削除されませんが、残念ながら最初に制約を削除する問題を処理します。残念ながら、sp_MSForEachTable(Azure SQL Serverには存在しません)を使用せずに、そのような答えを期待していました。
Pac0 2018年

はい。本当。すべてのテーブルのその切り捨てスクリプトを作成します。このスクリプトを使用して、テーブルデータを削除します。
Buddhika De Silva

このソリューションは、テーブルが正しい順序で削除されることを保証する方法がないため、関係がない場合にのみ機能します。また、データの削除に何らかのトリガーがあると、意図しない結果が生じる可能性があります。
dmoore1181
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.