¿Cómo eliminar todas las tablas de una base de datos con una consulta SQL?


176

No quiero escribir el nombre de todas las tablas para descartarlas todas. ¿Es posible con una consulta?


3
Algunas búsquedas rápidas en Google revelaron esto: stackoverflow.com/questions/11053116/…
JSK NS

-aunque (para SQLServer) esto podría ser más útil: stackoverflow.com/questions/536350/…

Con los nombres de usuario correctos, esto podría suceder automáticamente ( enlace xkcd obligatorio ).
Minnow

11
¿Tiene claves foráneas en las tablas de la base de datos? Si es así, deberías tener eso en cuenta y descartarlos antes de intentar descartar tablas.
Anthony Grist

Tenga en cuenta que si tiene objetos vinculados a un esquema, no puede soltar la tabla.
Sean Lange

Respuestas:


177

Use la vista INFORMATION_SCHEMA.TABLES para obtener la lista de tablas. Genere scripts de caída en la instrucción select y suéltelos usando SQL dinámico:

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

Nota: Si tiene alguna foreign Keysdefinida entre tablas, primero ejecute la consulta a continuación para deshabilitar todas las foreign keyspresentes en su base de datos.

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

Para más información, consulte aquí .


3
(no es mi voto negativo) ... generalmente me quedaría con las [sys]vistas de esquema si no se requiere portabilidad entre rdbms '. stackoverflow.com/a/3654313/251174
swasheck


1
@DoubleA: es muy simple. Primero estoy construyendo declaraciones Drop para todas las tablas en mi base de datos y almacenándolas en una variable. Para verificar esto, puede usarlo Print @sqlantes exec. Luego estoy ejecutando las declaraciones de caída construidas dinámicamente a través desp_executesql
P ரதீப்

2
Si usa Azure, sp_msforeachtable no está disponible. Encontré esta dulce pepita de @Aaron Bertrand para eliminar todas las restricciones de FK. Funciona muy bien con esta respuesta. dba.stackexchange.com/questions/90033/…
trevorc

3
Si sp_msforeachtable no está disponible, también puede ejecutar la consulta de eliminación varias veces, ya que las tablas que dependen de otras se eliminan :)
Maarten Kieft

88

Si desea usar solo una consulta SQL para eliminar todas las tablas, puede usar esto:

EXEC sp_MSforeachtable @command1 = "DROP TABLE ?"

Este es un procedimiento almacenado oculto en el servidor sql, y se ejecutará para cada tabla en la base de datos a la que esté conectado.

Nota: es posible que deba ejecutar la consulta varias veces para eliminar todas las tablas debido a dependencias.

Nota 2: Para evitar la primera nota, antes de ejecutar la consulta, primero verifique si hay relaciones de claves foráneas con alguna tabla. Si hay, simplemente deshabilite la restricción de clave externa ejecutando la consulta a continuación:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

1
Lo probé en mi base de datos SQL de Azure y no funcionó. Sin embargo, la respuesta anterior (por Prdp) funcionó.
Artemious

44
Para la nota al margen, necesito ejecutar el primer comando varias veces antes de descartar todas las tablas, pero funciona bien.
Alper el

1
@Thatshowweroll probablemente se deba a las dependencias de las tablas. Si una tabla tiene otras que dependen de ella, no se puede eliminar.
RageAgainstTheMachine

1
@RageAgainstTheMachine sí, definitivamente es de tablas con múltiples dependencias cruzadas. Quiero informar a los usuarios que lo ejecuten varias veces, los errores no son problemas. Ejecute el primer comando 3-4 veces, luego el segundo comando 1 vez y BOM. ¡Funciona de maravilla!
Alper

1
@KyleVassella sí, esto se ejecutará solo en la base de datos en la que tienes la consola abierta
RageAgainstTheMachine

39

Si no desea escribir, puede crear las declaraciones con esto:

USE Databasename

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

Luego copie y pegue en una nueva ventana SSMS para ejecutarlo.


el nombre de la tabla debe estar entre [], pero funciona muy bien incluso en Azure
Ondra

1
Podemos usar QUOTENAMEtambién lo que se ve bien. 'DROP TABLE ' + QUOTENAME(name) + ';'
P ரதீப்

13

También puede usar el siguiente script para descartar todo, incluido lo siguiente:

  • procedimientos almacenados que no son del sistema
  • puntos de vista
  • funciones
  • restricciones de clave externa
  • restricciones de clave principal
  • mesas

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

Simplemente haría un pequeño cambio en la respuesta y el uso de @ NoDisplayName QUOTENAME()en la TABLE_NAMEcolumna y también incluiría la TABLE_SCHEMAcolumna que encierra las tablas que no están en el dboesquema.

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 sysvistas de esquema (según el comentario de @ 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;

44
Por lo general, me quedaría con las [sys]vistas de esquema si no se requiere portabilidad a través de rdbms '. stackoverflow.com/a/3654313/251174
swasheck

1
@swasheck Gracias por el enlace que fue bastante interesante. He actualizado la respuesta con una solución usando vistas de esquema sys.
AeroX

Puede usar la función Schema_name () para obtener el nombre del esquema en lugar de unirse a msdn.microsoft.com/en-us/library/ms175068.aspx
P ரதீப்

@NoDisplayName hecho de que usted puede , no quiere decir que usted debe ... blogs.sqlsentry.com/aaronbertrand/...
Aaron Bertrand

@AaronBertrand - Mi mal pensamiento podría ser una mejor manera. Gracias por mencionarlo.
P ரதீப்

9

Como seguimiento a la respuesta de Dave.Gugg, este sería el código que alguien necesitaría para obtener todas las líneas DROP TABLE en MySQL:

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

2
Sé que el póster original etiquetaba la pregunta con "sql-server", pero esto podría ser útil para alguien que quiera hacer esto en MySQL. De hecho, encontré esta pregunta cuando busqué en Google una solución MySQL para esta pregunta, así que ahora estoy compartiendo la solución que se me ocurrió después de leer una de las respuestas aquí.
OMA

7

La forma más sencilla es soltar toda la base de datos y volver a crearla:

drop database db_name
create database db_name

Eso es todo.


1
:) al menos para mí, el propósito de descartar todas las tablas es porque la base de datos no se puede eliminar
Hasan Zafari

55
no ejecute este comando en la base de datos de la compañía. O prepárate para encontrar otro trabajo.
Faraz

@FarazDurrani, hombre fácil, descartar todas las tablas tampoco parece un trato para PROD db.
Supervisión

5

Si alguien más tuvo un problema con la solución de la mejor respuesta (incluida la desactivación de claves externas), aquí hay otra solución mía :

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

No exactamente 1 consulta, aún bastante corta y dulce:

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

Use el siguiente script para droptodos 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

Luego ejecute lo siguiente para descartar todas las tablas:

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

¡Esto funcionó para mí en Azure SQL Database donde 'sp_msforeachtable'no estaba disponible!


1

Sé que esta pregunta es muy antigua, pero cada vez que necesito este código ... por cierto, si tiene tablas y vistas y Funciones y PROCEDIMIENTOS, puede eliminarlo todo con este Script ... entonces, ¿por qué publico este Script? porque si eliminas todas las tablas deberás eliminar todas las vistas y si tienes Funciones y PROCEDIMIENTOS también debes eliminarlo,
espero que ayude a alguien

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.