web-dev-qa-db-fra.com

Comment supprimer toutes les tables d'une base de données SQL Server?

J'essaie d'écrire un script qui videra complètement une base de données SQL Server. C'est ce que j'ai jusqu'ici:

USE [dbname]
GO
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
EXEC sp_msforeachtable 'DELETE ?'

Lorsque je l'exécute dans Management Studio, je reçois:

Commande (s) terminée (s) avec succès.

mais quand je rafraîchit la liste des tables, ils sont tous encore là. Qu'est-ce que je fais mal?

129
dixuji

Cela ne fonctionne pas non plus pour moi lorsqu'il existe plusieurs tables de clés étrangères.
J'ai trouvé ce code qui fonctionne et fait tout ce que vous essayez (supprimez toutes les tables de votre base de données):

DECLARE @Sql NVARCHAR(500) DECLARE @Cursor CURSOR

SET @Cursor = CURSOR FAST_FORWARD FOR
SELECT DISTINCT sql = 'ALTER TABLE [' + tc2.TABLE_NAME + '] DROP [' + rc1.CONSTRAINT_NAME + ']'
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME =rc1.CONSTRAINT_NAME

OPEN @Cursor FETCH NEXT FROM @Cursor INTO @Sql

WHILE (@@FETCH_STATUS = 0)
BEGIN
Exec sp_executesql @Sql
FETCH NEXT FROM @Cursor INTO @Sql
END

CLOSE @Cursor DEALLOCATE @Cursor
GO

EXEC sp_MSforeachtable 'DROP TABLE ?'
GO

Vous pouvez trouver le message ici . C'est le message de Groker.

216
Gabriel GM

Vous pouvez également supprimer toutes les tables de la base de données en utilisant uniquement les outils MSSMS (sans utiliser SQL). Parfois, cette façon peut être plus confortable (surtout si elle est exécutée occasionnellement)

Je fais cela étape par étape comme suit:

  1. Sélectionnez 'Tables' dans l'arborescence de la base de données (Object Explorer)
  2. Appuyez sur F7 pour ouvrir la vue Détails de l'explorateur d'objets.
  3. Dans cette vue, sélectionnez les tables qui doivent être supprimées (dans ce cas, toutes)
  4. Appuyez sur Supprimer jusqu'à ce que toutes les tables soient supprimées (vous le répétez autant de fois que d'erreurs en raison de contraintes/dépendances clés).
216
Bronek

delete est utilisé pour supprimer des lignes d'une table. Vous devriez utiliser drop table à la place.

EXEC sp_msforeachtable 'drop table [?]'
30
DaveShaw
/* 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
22
Harpal

Vous avez presque raison, utilisez plutôt:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
EXEC sp_msforeachtable 'DROP TABLE ?'

mais la deuxième ligne vous devrez peut-être exécuter plus d'une fois jusqu'à ce que vous n'ayez plus d'erreur:

Could not drop object 'dbo.table' because it is referenced by a FOREIGN KEY constraint.

Message:

Command(s) completed successfully.

signifie que toutes les tables ont été supprimées avec succès.

15
Michał Powaga

Dans SSMS: 

  • Clic droit sur la base de données
  • Allez à "tâches"
  • Cliquez sur "Générer des scripts"
  • Dans la section "Choisir des objets", sélectionnez "Script de la base de données entière et de tous les objets de base de données".
  • Dans la section "Définir les options de script", cliquez sur le bouton "Avancé".
  • Sur "Script DROP et CREATE", basculez "Script CREATE" sur "Script DROP" et appuyez sur OK.
  • Ensuite, enregistrez dans un fichier, dans le Presse-papiers ou dans une nouvelle fenêtre de requête.
  • Script de lancement.

Maintenant, cela supprimera tout, y compris la base de données. Assurez-vous de supprimer le code des éléments que vous ne voulez pas supprimer. Sinon, dans la section "Choisir des objets", au lieu de sélectionner la totalité de la base de données, sélectionnez simplement les éléments à supprimer.

14
Ben

Court et doux:

USE YOUR_DATABASE_NAME
-- Disable all referential integrity constraints
EXEC sp_MSforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO

-- Drop all PKs and FKs
declare @sql nvarchar(max)
SELECT @sql = STUFF((SELECT '; ' + 'ALTER TABLE ' + Table_Name  +'  drop constraint ' + Constraint_Name  from Information_Schema.CONSTRAINT_TABLE_USAGE ORDER BY Constraint_Name FOR XML PATH('')),1,1,'')
EXECUTE (@sql)
GO

-- Drop all tables
EXEC sp_MSforeachtable 'DROP TABLE ?'
GO
13
Richard Pierre

La réponse acceptée ne prend pas en charge Azure. Il utilise une procédure stockée non documentée "sp_MSforeachtable". Si vous obtenez une erreur «Azure n'a pas pu trouver la procédure stockée 'sp_msforeachtable» lors de son exécution ou souhaitez simplement éviter de vous fier à des fonctionnalités non documentées (pouvant être supprimées ou modifiées à tout moment), essayez ce qui suit. 

Cette version ignore la table d'historique de migration du cadre d'entité "__MigrationHistory" et "database_firewall_rules", qui est une table Azure que vous ne serez pas autorisé à supprimer. 

Légèrement testé sur Azure. Vérifiez que cela n’a pas d’effets indésirables sur votre environnement. 

DECLARE @sql NVARCHAR(2000)

WHILE(EXISTS(SELECT 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE='FOREIGN KEY'))
BEGIN
    SELECT TOP 1 @sql=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']')
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
    EXEC(@sql)
    PRINT @sql
END

WHILE(EXISTS(SELECT * from INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME != '__MigrationHistory' AND TABLE_NAME != 'database_firewall_rules'))
BEGIN
    SELECT TOP 1 @sql=('DROP TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + ']')
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME != '__MigrationHistory' AND TABLE_NAME != 'database_firewall_rules'
    EXEC(@sql)
    PRINT @sql
END

Pris à partir de:

https://edspencer.me.uk/2013/02/25/drop-all-tables-in-a-sql-server-database-Azure-friendly/

http://www.sqlservercentral.com/blogs/sqlservertips/2011/10/11/remove-all-foreign-keys/

10
CountZero

Semble la commande devrait être sans la couverture carrée

EXEC sp_msforeachtable 'drop table ?'
4
Jimmy Wong

La voie à jeun est:

  1. Nouveaux diagrammes de base de données
  2. Ajouter tout le tableau
  3. Ctrl + A pour tout sélectionner
  4. Clic droit "Supprimer de la base de données"
  5. Ctrl + S pour enregistrer
  6. Prendre plaisir
2
TuanDPH

Pourquoi ne pas supprimer la base de données entière et la créer à nouveau? Cela fonctionne pour moi.

DROP DATABASE mydb;
CREATE DATABASE mydb;
1
Chong Lip Phang

Pour moi, le moyen le plus simple:

--First delete all constraints

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';

SELECT @sql = @sql + N'
ALTER TABLE ' + QUOTENAME(s.name) + N'.'
+ QUOTENAME(t.name) + N' DROP CONSTRAINT '
+ QUOTENAME(c.name) + ';'
FROM sys.objects AS c
INNER JOIN sys.tables AS t
ON c.parent_object_id = t.[object_id]
INNER JOIN sys.schemas AS s 
ON t.[schema_id] = s.[schema_id]
WHERE c.[type] IN ('D','C','F','PK','UQ')
ORDER BY c.[type];

EXEC sys.sp_executesql @sql;

-- Then drop all tables

exec sp_MSforeachtable 'DROP TABLE ?'
0
Jeffrey

Je sais que c’est un vieux message maintenant, mais j’ai essayé toutes les réponses ici sur une multitude de bases de données et j’ai trouvé qu’elles fonctionnaient toutes parfois, mais pas toujours, pour diverses (je ne peux que supposer) des bizarreries de SQL Server.

Finalement, je suis venu avec cela. J'ai testé cela partout (en général), je peux et cela fonctionne (sans procédure de magasin caché). 

À noter principalement sur SQL Server 2014. (mais la plupart des autres versions que j'ai essayées semblent également fonctionner correctement).

J'ai essayé des boucles While, des valeurs nulles, etc., des curseurs et diverses autres formes, mais elles semblent toujours échouer sur certaines bases de données, mais pas les autres, sans raison évidente.

Obtenir un compte et utiliser cela pour itérer semble toujours fonctionner sur tout ce que j'ai testé.

USE [****YOUR_DATABASE****]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- Drop all referential integrity constraints --
-- Drop all Primary Key constraints.          --

DECLARE @sql  NVARCHAR(296)
DECLARE @table_name VARCHAR(128)

DECLARE @constraint_name VARCHAR(128)
SET @constraint_name = ''

DECLARE @row_number INT

SELECT @row_number = Count(*) FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME = rc1.CONSTRAINT_NAME

WHILE @row_number > 0
BEGIN
    BEGIN
        SELECT TOP 1 @table_name = tc2.TABLE_NAME, @constraint_name = rc1.CONSTRAINT_NAME FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
        LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME = rc1.CONSTRAINT_NAME
        AND rc1.CONSTRAINT_NAME > @constraint_name
        ORDER BY rc1.CONSTRAINT_NAME
        SELECT @sql = 'ALTER TABLE [dbo].[' + RTRIM(@table_name) +'] DROP CONSTRAINT [' + RTRIM(@constraint_name)+']'
        EXEC (@sql)
        PRINT 'Dropped Constraint: ' + @constraint_name + ' on ' + @table_name
        SET @row_number = @row_number - 1
    END
END
GO

-- Drop all tables --

DECLARE @sql  NVARCHAR(156)
DECLARE @name VARCHAR(128)
SET @name = ''

DECLARE @row_number INT

SELECT @row_number = Count(*) FROM sysobjects WHERE [type] = 'U' AND category = 0

WHILE @row_number > 0
BEGIN
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name])
    SELECT @sql = 'DROP TABLE [dbo].[' + RTRIM(@name) +']'
    EXEC (@sql)
    PRINT 'Dropped Table: ' + @name
    SET @row_number = @row_number - 1
END
GO
0
William Humphreys

Si vous voulez supprimer toutes les tables, vous pouvez également supprimer la base de données, puis en créer une nouvelle. 

T-SQL:

DROP DATABASE Northwind 
ALLER 
CREATE DATABASE Northwind 
ALLER

Pour cela dans SQL Management Studio (SSMS, dans mon cas, version 17.9.1):

  1. Cliquez avec le bouton droit sur la base de données que vous souhaitez supprimer, par exemple. "Vent du nord"; 
    Sélectionnez "Supprimer" dans le menu contextuel.
  2. Cliquez avec le bouton droit sur "Bases de données" (icône de dossier); 
    Sélectionnez "Nouvelle base de données ..."
  3. Tapez le nom de la base de données , par exemple. "Vent du nord"; 
    Cliquez OK

Et tu as fini! Vous avez une nouvelle base de données sans aucune table. L'avantage de cette approche est que vous n'avez pas à vous soucier de contraintes, interdisant de supprimer des tables, des vues dépendantes ou des SP ne fonctionnant plus et n'ayant pas besoin de scripts SQL dynamiques. Vous pouvez les rajouter plus tard, à condition que vous ayez pris une sauvegarde, afin

Rappelez-vous pour sauvegarder votre base de données avant, faites-le! Si vous avez juste besoin de SP ou de vues, enregistrez-les en tant que script avant de recréer la base de données, modifiez-les pour qu'ils fonctionnent avec les nouvelles tables et les ajoutent ultérieurement.

0
Matt