Wie lösche ich alle Tabellen mit einer SQL-Abfrage aus einer Datenbank?

175

Ich möchte nicht den Namen aller Tabellen eingeben, um alle zu löschen. Ist es mit einer Abfrage möglich?

Majid
quelle
3
Einige schnelle googeln enthüllte dies: stackoverflow.com/questions/11053116/…
JSK NS
-Obwohl (für SQLServer) könnte dies nützlicher sein: stackoverflow.com/questions/536350/…
Mit den richtigen Benutzernamen könnte dies automatisch geschehen ( obligatorischer xkcd-Link ).
Minnow
11
Haben Sie Fremdschlüssel für Tabellen in der Datenbank? Wenn ja, müssen Sie dies berücksichtigen und diese löschen, bevor Sie versuchen, Tabellen zu löschen.
Anthony Grist
Beachten Sie, dass Sie die Tabelle nicht löschen können, wenn Sie schemaboundierte Objekte haben.
Sean Lange

Antworten:

176

Verwenden Sie die Ansicht INFORMATION_SCHEMA.TABLES , um die Liste der Tabellen abzurufen. Generieren Sie Drop-Skripte in der select-Anweisung und löschen Sie sie mit Dynamic SQL:

DECLARE @sql NVARCHAR(max)=''

SELECT @sql += ' Drop table ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) + '; '
FROM   INFORMATION_SCHEMA.TABLES
WHERE  TABLE_TYPE = 'BASE TABLE'

Exec Sp_executesql @sql

Sys.Tables Version

DECLARE @sql NVARCHAR(max)=''

SELECT @sql += ' Drop table ' + QUOTENAME(s.NAME) + '.' + QUOTENAME(t.NAME) + '; '
FROM   sys.tables t
       JOIN sys.schemas s
         ON t.[schema_id] = s.[schema_id]
WHERE  t.type = 'U'

Exec sp_executesql @sql

Hinweis: Wenn foreign Keyszwischen Tabellen eine Definition vorliegt, führen Sie zuerst die folgende Abfrage aus, um alle foreign keysin Ihrer Datenbank vorhandenen zu deaktivieren .

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

Weitere Informationen finden Sie hier .

P ரதீப்
quelle
3
(nicht meine Ablehnung) ... Ich würde mich im Allgemeinen an die [sys]Schemaansichten halten, wenn keine Portabilität über rdbms 'erforderlich ist. stackoverflow.com/a/3654313/251174
Swasheck
1
@DoubleA - Es ist sehr einfach. Zuerst erstelle ich Drop-Anweisungen für alle Tabellen in meiner Datenbank und speichere sie in einer Variablen. Um dies zu überprüfen, können Sie Print @sqlvorher verwenden exec. Dann sp_executesql
führe
2
Wenn Sie Azure verwenden, ist sp_msforeachtable nicht verfügbar. Ich habe dieses süße Nugget von @Aaron Bertrand gefunden, um alle FK-Einschränkungen zu löschen. Funktioniert wirklich gut mit dieser Antwort. dba.stackexchange.com/questions/90033/…
trevorc
3
Wenn die sp_msforeachtable nicht verfügbar ist, können Sie die Löschabfrage auch mehrmals ausführen, da die von anderen abhängigen Tabellen dann gelöscht werden :)
Maarten Kieft
87

Wenn Sie nur eine SQL-Abfrage verwenden möchten, um alle Tabellen zu löschen, können Sie Folgendes verwenden:

EXEC sp_MSforeachtable @command1 = "DROP TABLE ?"

Dies ist eine versteckte gespeicherte Prozedur auf einem SQL Server und wird für jede Tabelle in der Datenbank ausgeführt, mit der Sie verbunden sind.

Hinweis: Möglicherweise müssen Sie die Abfrage einige Male ausführen, um alle Tabellen aufgrund von Abhängigkeiten zu löschen.

Hinweis 2: Um den ersten Hinweis zu vermeiden, überprüfen Sie vor dem Ausführen der Abfrage zunächst, ob Fremdschlüsselbeziehungen zu einer Tabelle bestehen. Wenn dies der Fall ist, deaktivieren Sie einfach die Fremdschlüsseleinschränkung, indem Sie die folgende Abfrage ausführen:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
RageAgainstTheMachine
quelle
1
Ich habe es in meiner Azure SQL-Datenbank versucht und es hat nicht funktioniert. Die obige Antwort (von Prdp) hat jedoch funktioniert.
Artemious
4
Für die Randnotiz muss ich den ersten Befehl mehrmals ausführen, bevor alle Tabellen gelöscht werden, aber es funktioniert gut.
Alper
1
@Thatshowweroll, das liegt wahrscheinlich an den Abhängigkeiten der Tabellen. Wenn eine Tabelle andere davon abhängige hat, kann sie nicht gelöscht werden.
RageAgainstTheMachine
1
@RageAgainstTheMachine Ja, es ist definitiv aus Tabellen mit mehreren Kreuzabhängigkeiten. Ich möchte Benutzer darüber informieren, dass sie es mehrmals ausführen sollen. Fehler sind keine Probleme. Führen Sie den ersten Befehl 3-4 Mal aus, dann den zweiten Befehl 1 Mal und die Stückliste. Es funktioniert wie Charme!
Alper
1
@KyleVassella Ja, dies wird nur in der Datenbank ausgeführt, in der Sie Ihre Konsole geöffnet haben
RageAgainstTheMachine
38

Wenn Sie nicht eingeben möchten, können Sie die Anweisungen folgendermaßen erstellen:

USE Databasename

SELECT  'DROP TABLE [' + name + '];'
FROM    sys.tables

Kopieren Sie dann und fügen Sie es in ein neues SSMS-Fenster ein, um es auszuführen.

Dave.Gugg
quelle
Tabellenname sollte in [] eingeschlossen werden, funktioniert aber auch unter Azure
Ondra
1
Wir können QUOTENAMEauch verwenden, was ordentlich aussieht. 'DROP TABLE ' + QUOTENAME(name) + ';'
P ரதீப்
13

Sie können auch das folgende Skript verwenden, um alles zu löschen, einschließlich des folgenden:

  • Nicht vom System gespeicherte Prozeduren
  • Ansichten
  • Funktionen
  • Fremdschlüsseleinschränkungen
  • Primärschlüsseleinschränkungen
  • Tabellen

https://michaelreichenbach.de/how-to-drop-everything-in-a-mssql-database/

/* 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
Silthus
quelle
9

Ich würde nur eine kleine Änderung an der Antwort und Verwendung QUOTENAME()von @ NoDisplayName für die TABLE_NAMESpalte vornehmen und auch die TABLE_SCHEMASpalteneinfassung einschließen, in der die Tabellen nicht im dboSchema enthalten sind.

DECLARE @sql nvarchar(max) = '';

SELECT @sql += 'DROP TABLE ' + QUOTENAME([TABLE_SCHEMA]) + '.' + QUOTENAME([TABLE_NAME]) + ';'
FROM [INFORMATION_SCHEMA].[TABLES]
WHERE [TABLE_TYPE] = 'BASE TABLE';

EXEC SP_EXECUTESQL @sql;

Oder verwenden Sie sysSchemaansichten (gemäß @ swashecks Kommentar):

DECLARE @sql nvarchar(max) = '';

SELECT @sql += 'DROP TABLE ' + QUOTENAME([S].[name]) + '.' + QUOTENAME([T].[name]) + ';'
FROM [sys].[tables] AS [T]
INNER JOIN [sys].[schemas] AS [S] ON ([T].[schema_id] = [S].[schema_id])
WHERE [T].[type] = 'U' AND [T].[is_ms_shipped] = 0;

EXEC SP_EXECUTESQL @sql;
AeroX
quelle
4
Ich würde im Allgemeinen bei den [sys]Schemaansichten bleiben, wenn keine Portabilität über rdbms 'erforderlich ist. stackoverflow.com/a/3654313/251174
Swasheck
1
@swasheck Danke für den Link, der sehr interessant war. Ich habe die Antwort mit einer Lösung aktualisiert, die Systemschemaansichten verwendet.
AeroX
Sie können die Funktion Schema_name () verwenden, um den Schemanamen abzurufen,
P ரதீப்
@NoDisplayName Nur weil Sie können , bedeutet nicht , dass Sie sollten ... blogs.sqlsentry.com/aaronbertrand/...
Aaron Bertrand
@ AaronBertrand - Mein schlechter Gedanke, es könnte ein besserer Weg sein. Vielen Dank für den Hinweis.
P ரதீப்
9

Als Folge der Antwort von Dave.Gugg wäre dies der Code, den jemand benötigen würde, um alle DROP TABLE-Zeilen in MySQL abzurufen:

SELECT CONCAT('DROP TABLE ', TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.tables
WHERE TABLE_SCHEMA = 'your_database_name'
OMA
quelle
2
Ich weiß, dass das Originalposter die Frage mit "SQL-Server" beschriftet hat, aber dies könnte für jemanden nützlich sein, der dies in MySQL tun möchte. Tatsächlich habe ich diese Frage gefunden, als ich nach einer MySQL-Lösung für diese Frage gegoogelt habe. Daher teile ich jetzt die Lösung, die ich mir ausgedacht habe, nachdem ich eine der Antworten hier gelesen habe.
OMA
7

Am einfachsten ist es, die gesamte Datenbank zu löschen und erneut zu erstellen:

drop database db_name
create database db_name

Das ist alles.

Aufsicht
quelle
1
:) Zumindest für mich ist der Zweck des Löschens aller Tabellen, weil Datenbank nicht gelöscht werden kann
Hasan Zafari
5
Führen Sie diesen Befehl nicht in der Datenbank des Unternehmens aus. Oder seien Sie bereit, einen anderen Job zu finden.
Faraz
@FarazDurrani einfacher Mann, alle Tische fallen zu lassen scheint auch für PROD db kein Deal zu sein.
Aufsicht
5

Wenn jemand anderes ein Problem mit der Lösung der besten Antwort hatte (einschließlich des Deaktivierens von Fremdschlüsseln), ist hier eine andere Lösung von mir :

-- CLEAN DB
USE [DB_NAME]
    EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
    EXEC sp_MSForEachTable 'DELETE FROM ?'

    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

    EXEC sp_MSForEachTable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL'
Ani
quelle
3

Nicht ganz 1 Abfrage, immer noch ziemlich kurz und bündig:

-- 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
xx1xx
quelle
3

Verwenden Sie das folgende Skript für dropalle constraints:

DECLARE @sql NVARCHAR(max)=''

SELECT @sql += ' ALTER TABLE ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) +    ' NOCHECK CONSTRAINT all; '
FROM   INFORMATION_SCHEMA.TABLES
WHERE  TABLE_TYPE = 'BASE TABLE'

Exec Sp_executesql @sql

Führen Sie dann Folgendes aus, um alle Tabellen zu löschen:

select @sql='';

SELECT @sql += ' Drop table ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) + '; '
FROM   INFORMATION_SCHEMA.TABLES
WHERE  TABLE_TYPE = 'BASE TABLE'

Exec Sp_executesql @sql

Dies funktionierte für mich in der Azure SQL-Datenbank, wo 'sp_msforeachtable'nicht verfügbar war!

David Nyaoso
quelle
1

Ich weiß, dass diese Frage sehr alt ist, aber jedes Mal, wenn ich diesen Code benötige. Übrigens, wenn Sie Tabellen und Ansichten sowie Funktionen und VERFAHREN haben, können Sie alles mit diesem Skript löschen. Warum poste ich dieses Skript? denn wenn du alle Tabellen löschst, musst du alle Ansichten löschen und wenn du Funktionen und VERFAHREN hast, musst du sie auch löschen.
Ich hoffe, es wird jemandem helfen

DECLARE @sql NVARCHAR(max)=''

 SELECT @sql += ' Drop table ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) 
+ '; '
FROM   INFORMATION_SCHEMA.TABLES
WHERE  TABLE_TYPE = 'BASE TABLE'

Exec Sp_executesql @sql


 DECLARE @sql VARCHAR(MAX) = ''
    , @crlf VARCHAR(2) = CHAR(13) + CHAR(10) ;

 SELECT @sql = @sql + 'DROP VIEW ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + 
 QUOTENAME(v.name) +';' + @crlf
 FROM   sys.views v

 PRINT @sql;
 EXEC(@sql);

 declare @procName varchar(500)
 declare cur cursor 

 for select [name] from sys.objects where type = 'p'
 open cur
 fetch next from cur into @procName
 while @@fetch_status = 0
 begin
  exec('drop procedure [' + @procName + ']')
fetch next from cur into @procName
 end
  close cur
  deallocate cur

  Declare @sql NVARCHAR(MAX) = N'';

    SELECT @sql = @sql + N' DROP FUNCTION ' 
               + QUOTENAME(SCHEMA_NAME(schema_id)) 
               + N'.' + QUOTENAME(name)
    FROM sys.objects
  WHERE type_desc LIKE '%FUNCTION%';

   Exec sp_executesql @sql
  GO
Aladein
quelle