142 votes

Supprimer toutes les données de la base de données SQL Server

Comment puis-je supprimer tous les enregistrements de toutes les tables de ma base de données ? Puis-je le faire avec une seule commande SQL ou ai-je besoin d'une commande SQL par table ?

213voto

Ryan Kirkman Points 990

La solution de SQLMenace a fonctionné pour moi avec une légère modification de la façon dont les données sont supprimées. DELETE FROM au lieu de 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

0 votes

Moi à.. J'ai pu supprimer, mais pas tronquer.

20 votes

Il pourrait également être utile de faire un EXEC sp_MSForEachTable 'DBCC CHECKIDENT(''?'', RESEED, 0)' après le DELETE FROM pour remettre toutes les colonnes d'identité à 0.

2 votes

C'est toujours un bon début de journée quand vous trouvez 6 lignes de code qui remplacent des centaines de déclarations de suppression ! Cette méthode fonctionne sans problème sur SQL 2014 Express.

38voto

SQLMenace Points 68670

En général, je me contenterai d'utiliser la procédure non documentée 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

Voir aussi : Effacer toutes les données dans la base de données (lorsque vous avez des FKs)

1 votes

Je ne pense pas que ça marche. On dirait que Kalen Delaney a été par inadvertance responsable du lancement de cette idée. Elle clarifie ici "vous devez laisser tomber la contrainte de référencement afin de tronquer la table."

0 votes

Martin, je viens de le lancer il y a 2 secondes dans la base de données Adventureworks sans problème.

0 votes

Cela ne fonctionne pas pour moi ici. create database testing; GO use testing; create table t1 (i int primary key) create table t2(i int primary key,p int references t1)

20voto

Harpal Points 769
/* 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

0 votes

Script intéressant, qui n'utilise pas la proc stockée non couplée 'sp_MSForEachTable', qui est manquante sur Azure. Il faut cependant l'ajuster si vous avez des objets sur un autre schéma que [dbo].

0 votes

Veuillez utiliser gist.github.com/metaskills/893599 pour créer sp_MSForEachTable dans Azure

16voto

SchmitzIT Points 4143

Je suis conscient que c'est en retard, mais je suis d'accord avec la suggestion d'AlexKuznetsov de script la base de données, plutôt que de passer par le tracas de purger les données des tables. Si le TRUNCATE ne fonctionne pas et que vous disposez d'une grande quantité de données, vous pouvez émettre (enregistré) DELETE peut prendre beaucoup de temps, et vous vous retrouverez avec des identificateurs qui n'ont pas été réensemencés (c'est à dire un INSERT dans un tableau avec un IDENTITY vous obtiendriez un ID de 50000 au lieu d'un ID de 1).

Pour script une base de données entière, dans SSMS, cliquez avec le bouton droit de la souris sur la base de données, puis sélectionnez. TASKS -> Generate scripts :

enter image description here

Cliquez sur Next pour sauter l'écran d'ouverture de l'assistant, puis sélectionnez les objets que vous voulez script :

enter image description here

Dans le Set scripting options vous pouvez choisir des paramètres pour le scripting, par exemple si vous voulez générer un script pour tous les objets ou des scripts séparés pour les objets individuels, et si vous voulez enregistrer le fichier en Unicode ou ANSI :

enter image description here

L'assistant affichera un résumé, que vous pourrez utiliser pour vérifier que tout est conforme à vos souhaits, et vous pourrez fermer en cliquant sur "Terminer".

1 votes

Attention, de cette façon, par défaut, vous perdrez des choses comme les index si vous n'allez pas sur le bouton "Avancé".

5voto

AlexKuznetsov Points 9555

Il est généralement beaucoup plus rapide de script supprimer tous les objets de la base de données, et de créer une base vide, que de supprimer ou de tronquer les tables.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X