Come eliminare tutte le tabelle da un database con una query SQL?


176

Non voglio digitare il nome di tutte le tabelle per eliminarle tutte. È possibile con una query?


3
Alcuni rapidi googling lo hanno rivelato: stackoverflow.com/questions/11053116/…
JSK NS

-anche se (per SQLServer) questo potrebbe essere più utile: stackoverflow.com/questions/536350/...

Con i nomi utente corretti, ciò potrebbe accadere automaticamente ( link xkcd obbligatorio ).
Minnow,

11
Hai delle chiavi esterne nelle tabelle nel database? In tal caso, dovresti tenerne conto e rilasciarli prima di provare a eliminare le tabelle.
Anthony Grist,

Tieni presente che se hai oggetti schemabound non puoi eliminare la tabella.
Sean Lange,

Risposte:


177

Utilizzare la vista INFORMATION_SCHEMA.TABLES per ottenere l'elenco delle tabelle. Genera gli script Drop nell'istruzione select e rilasciali utilizzando 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

Versione Sys.Tables

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

Nota: se è stata foreign Keysdefinita una qualsiasi tra le tabelle, eseguire prima la query seguente per disabilitare tutti i foreign keyspresenti nel database.

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

Per maggiori informazioni, controlla qui .


3
(non il mio downvote) ... in genere [sys]rimarrei con le viste dello schema se la portabilità attraverso rdbms 'non è richiesta. stackoverflow.com/a/3654313/251174
swasheck


1
@DoubleA - È molto semplice. In primo luogo sto costruendo le istruzioni Drop per tutte le tabelle nel mio database e memorizzandole in una variabile. Per verificare ciò puoi usare Print @sqlprima exec. Quindi sp_executesql
eseguo le

2
Se si usa Azure, sp_msforeachtable non è disponibile. Ho trovato questa dolce pepita da @Aaron Bertrand per eliminare tutti i vincoli dell'FK. Funziona davvero bene con questa risposta. dba.stackexchange.com/questions/90033/…
trevorc

3
Se sp_msforeachtable non è disponibile, puoi anche eseguire la query di eliminazione più volte, poiché le tabelle che dipendono da altri vengono quindi eliminate :)
Maarten Kieft

88

Se si desidera utilizzare solo una query SQL per eliminare tutte le tabelle, è possibile utilizzare questo:

EXEC sp_MSforeachtable @command1 = "DROP TABLE ?"

Questa è una stored procedure nascosta nel server sql e verrà eseguita per ogni tabella nel database a cui si è connessi.

Nota: potrebbe essere necessario eseguire la query alcune volte per eliminare tutte le tabelle a causa delle dipendenze.

Nota2: per evitare la prima nota, prima di eseguire la query, controllare innanzitutto se esistono relazioni di chiavi esterne con qualsiasi tabella. Se ci sono quindi solo disabilitare il vincolo di chiave esterna eseguendo la query qui sotto:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

1
L'ho provato sul mio database SQL di Azure e non ha funzionato. Tuttavia, la risposta sopra (di Prdp) ha funzionato.
Artemious

4
Per la nota a margine, ho bisogno di eseguire il primo comando più volte prima di eliminare tutte le tabelle ma funziona benissimo.
Alper,

1
@Thatshowweroll questo è probabilmente a causa delle dipendenze delle tabelle. Se una tabella ne ha altre che dipendono da essa, non può essere eliminata.
RageAgainstTheMachine,

1
@RageAgainstTheMachine sì, è sicuramente dalle tabelle con più dipendenze incrociate. Voglio informare gli utenti di eseguirlo più volte, gli errori non sono problemi. Esegui il primo comando 3-4 volte, quindi il secondo comando 1 volta e la DBA. Funziona come un incantesimo!
Alper,

1
@KyleVassella sì, questo verrà eseguito solo sul database in cui hai la console aperta
RageAgainstTheMachine

39

Se non si desidera digitare, è possibile creare le istruzioni con questo:

USE Databasename

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

Quindi copia e incolla in una nuova finestra SSMS per eseguirlo.


il nome della tabella dovrebbe essere racchiuso tra [], ma funziona benissimo anche su Azure
Ondra,

1
Possiamo usare QUOTENAMEanche quello che sembra pulito. 'DROP TABLE ' + QUOTENAME(name) + ';'
P ரதீப்

13

Puoi anche usare il seguente script per eliminare tutto, incluso quanto segue:

  • stored procedure non di sistema
  • visualizzazioni
  • funzioni
  • vincoli di chiave esterna
  • vincoli chiave primaria
  • tavoli

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

9

Vorrei solo apportare una piccola modifica alla risposta e all'utilizzo di @ NoDisplayName QUOTENAME()sulla TABLE_NAMEcolonna e includerei anche la TABLE_SCHEMAcolonna in cui le tabelle non sono nello dboschema.

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;

O usando le sysviste dello schema (come da commento di @ swasheck):

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;

4
in genere [sys]rimarrei con le viste dello schema se non è richiesta la portabilità attraverso rdbms '. stackoverflow.com/a/3654313/251174
swasheck

1
@swasheck Grazie per il link che è stato abbastanza interessante. Ho aggiornato la risposta con una soluzione usando le viste dello schema sys.
AeroX il

È possibile utilizzare la funzione Schema_name () per ottenere il nome dello schema anziché unirsi a msdn.microsoft.com/en-us/library/ms175068.aspx
P ரதீப்

@NoDisplayName Solo perché puoi , non significa che dovresti ... blogs.sqlsentry.com/aaronbertrand/…
Aaron Bertrand il

@AaronBertrand - Il mio cattivo pensiero potrebbe essere un modo migliore. Grazie per segnalarlo.
P ரதீப்

9

Come seguito alla risposta di Dave.Gugg, questo sarebbe il codice di cui qualcuno avrebbe bisogno per ottenere tutte le linee DROP TABLE in MySQL:

SELECT CONCAT('DROP TABLE ', TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.tables
WHERE TABLE_SCHEMA = 'your_database_name'

2
So che il poster originale ha etichettato la domanda con "sql-server", ma questo potrebbe essere utile a qualcuno che cerca di farlo in MySQL. In effetti ho trovato questa domanda quando cercavo su Google una soluzione MySQL a questa domanda, quindi ora sto condividendo la soluzione che ho trovato dopo aver letto una delle risposte qui.
OMA,

7

Il modo più semplice è eliminare l'intero database e crearlo di nuovo:

drop database db_name
create database db_name

È tutto.


1
:) almeno per me lo scopo di eliminare tutte le tabelle è perché il database non può essere cancellato
Hasan Zafari

5
non eseguire questo comando sul database dell'azienda. O sii pronto a trovare un altro lavoro.
Faraz,

@FarazDurrani, amico semplice, far cadere tutti i tavoli non sembra neanche un affare per PROD db.
Supervisione del

5

Se qualcun altro ha avuto un problema con la soluzione della migliore risposta (inclusa la disabilitazione delle chiavi esterne), ecco un'altra mia soluzione :

-- 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'

3

Non abbastanza 1 query, ancora abbastanza breve e dolce:

-- 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

3

Usa il seguente script per droptutti 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

Quindi eseguire quanto segue per eliminare tutte le tabelle:

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

Questo ha funzionato per me nel database SQL di Azure dove 'sp_msforeachtable'non era disponibile!


1

So che questa domanda è molto vecchia ma ogni volta che ho bisogno di questo codice .. a proposito se hai tabelle e viste e funzioni e PROCEDURE puoi eliminarlo tutto da questo Script .. quindi perché inserisco questo Script ?? perché se elimini tutte le tabelle dovrai eliminare tutte le viste e se hai funzioni e PROCEDURE devi eliminarlo anche
io spero che possa aiutare qualcuno

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.