Como descartar todas as tabelas de um banco de dados com uma consulta SQL?

176

Não quero digitar o nome de todas as tabelas para descartá-las. É possível com uma consulta?

Majid
fonte
3
Algumas pesquisas rápidas no Google revelaram isso: stackoverflow.com/questions/11053116/…
JSK NS
-alquanto (para SQLServer) isso possa ser mais útil: stackoverflow.com/questions/536350/…
Com os nomes de usuário corretos, isso pode acontecer automaticamente ( link obrigatório xkcd ).
Minnow
11
Você possui chaves estrangeiras nas tabelas do banco de dados? Nesse caso, você precisará levar isso em consideração e descartá-las antes de tentar descartar tabelas.
Anthony Grist
Lembre-se de que, se você tiver objetos de esquema, não poderá descartar a tabela.
Sean Lange

Respostas:

177

Use a visualização INFORMATION_SCHEMA.TABLES para obter a lista de tabelas. Gere scripts de descarte na instrução select e solte-o usando o 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

Versão do 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 você tiver alguma foreign Keysdefinida entre tabelas, execute primeiro a consulta abaixo para desativar todos os foreign keyspresentes no seu banco de dados.

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

Para mais informações, clique aqui .

P ரதீப்
fonte
3
(não meu voto negativo) ... Eu geralmente ficaria com as [sys]visualizações de esquema se a portabilidade entre rdbms 'não for necessária. stackoverflow.com/a/3654313/251174
swasheck
1
@ DoubleA - É muito simples. Primeiro, estou criando instruções Drop para todas as tabelas do meu banco de dados e armazenando-as em uma variável. Para verificar isso, você pode usar Print @sqlantes exec. Então estou executando as declarações gota construídas dinamicamente atravéssp_executesql
P ரதீப்
2
Se você estiver usando o Azure, sp_msforeachtable não estará disponível. Encontrei essa pepita doce do @Aaron Bertrand para excluir todas as restrições do FK. Funciona muito bem com esta resposta. dba.stackexchange.com/questions/90033/…
trevorc
3
Se o sp_msforeachtable não está disponível, você também pode executar a consulta de exclusão várias vezes, desde as mesas que dependem de outras pessoas são então excluídos :)
Maarten Kieft
88

Se você deseja usar apenas uma consulta SQL para excluir todas as tabelas, pode usar este:

EXEC sp_MSforeachtable @command1 = "DROP TABLE ?"

Este é um procedimento armazenado oculto no servidor sql e será executado para cada tabela no banco de dados ao qual você está conectado.

Nota: Pode ser necessário executar a consulta algumas vezes para excluir todas as tabelas devido a dependências.

Nota2: Para evitar a primeira nota, antes de executar a consulta, verifique primeiro se há relações de chaves estrangeiras com alguma tabela. Se houver, basta desativar a restrição de chave estrangeira executando a consulta abaixo:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
Raiva contra a máquina
fonte
1
Eu tentei no meu banco de dados SQL do Azure e não funcionou. No entanto, a resposta acima (do Prdp) funcionou.
Artemious
4
Para a observação lateral, eu preciso executar o primeiro comando várias vezes antes de soltar todas as tabelas, mas funciona bem.
Alper
1
@Thatshowweroll, provavelmente por causa das dependências das tabelas. Se uma tabela tiver outras que dependem dela, ela não poderá ser excluída.
RageAgainstTheMachine
1
@RageAgainstTheMachine sim, é definitivamente de tabelas com várias dependências cruzadas. Quero informar os usuários para executá-lo várias vezes, erros não são problemas. Execute o primeiro comando 3-4 vezes e o segundo comando 1 vez e BOM. Funciona como charme!
Alper
1
@KyleVassella sim, isso será executado apenas no banco de dados em que o console
estiver
39

Se você não quiser digitar, poderá criar as instruções com isso:

USE Databasename

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

Em seguida, copie e cole em uma nova janela do SSMS para executá-lo.

Dave.Gugg
fonte
nome da tabela deve ser envolto em [], mas funciona muito bem mesmo em Azure
Ondra
1
Podemos usar QUOTENAMEtambém o que parece arrumado. 'DROP TABLE ' + QUOTENAME(name) + ';'
P ரதீப்
13

Você também pode usar o seguinte script para descartar tudo, incluindo o seguinte:

  • procedimentos armazenados não pertencentes ao sistema
  • Visualizações
  • funções
  • restrições de chave estrangeira
  • restrições de chave primária
  • 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
Silthus
fonte
9

Gostaria apenas de fazer uma pequena alteração na resposta de @ NoDisplayName e usá-la QUOTENAME()na TABLE_NAMEcoluna e também incluir a TABLE_SCHEMAcoluna em que as tabelas não estão no 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;

Ou usando sysvisualizações de esquema (conforme comentário do @ 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;
AeroX
fonte
4
Eu normalmente ficaria com as [sys]visualizações de esquema se a portabilidade entre os rdbms 'não for necessária. stackoverflow.com/a/3654313/251174
swasheck
1
@swasheck Obrigado pelo link que foi bastante interessante. Atualizei a resposta com uma solução usando exibições de esquema sys.
Aerox
Você pode usar a função Schema_name () para obter o nome do esquema, em vez de ingressar em msdn.microsoft.com/en-us/library/ms175068.aspx
P:
@NoDisplayName Só porque você pode , não significa que você deveria ... blogs.sqlsentry.com/aaronbertrand/… #
Aaron Bertrand
@AaronBertrand - Meu pensamento ruim poderia ser uma maneira melhor. Obrigado por apontar isso.
P ரதீப்
9

Como acompanhamento da resposta de Dave.Gugg, este seria o código que alguém precisaria para obter todas as linhas DROP TABLE no MySQL:

SELECT CONCAT('DROP TABLE ', TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.tables
WHERE TABLE_SCHEMA = 'your_database_name'
OMA
fonte
2
Eu sei que o pôster original rotulou a pergunta com "sql-server", mas isso pode ser útil para quem deseja fazer isso no MySQL. Na verdade, eu encontrei essa pergunta ao pesquisar uma solução MySQL para essa pergunta, então agora estou compartilhando a solução que encontrei depois de ler uma das respostas aqui.
OMA
7

A maneira mais simples é descartar o banco de dados inteiro e criá-lo novamente:

drop database db_name
create database db_name

Isso é tudo.

Supervisão
fonte
1
:) pelo menos para mim o propósito de droping todas as tabelas é porque banco de dados não pode ser excluído
Hasan Zafari
5
não execute este comando no banco de dados da empresa. Ou esteja pronto para encontrar outro emprego.
Faraz
@FarazDurrani cara fácil, largar todas as mesas também não parece um acordo para o PROD db.
Supervisão
5

Se alguém mais teve um problema com a solução da melhor resposta (incluindo a desativação de chaves estrangeiras), aqui está outra solução minha :

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

Não é exatamente uma consulta, ainda é bastante curta e agradável:

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

Use o seguinte 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

Em seguida, execute o seguinte para eliminar todas as tabelas:

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

Isso funcionou para mim no Banco de Dados SQL do Azure, onde 'sp_msforeachtable'não estava disponível!

David Nyaoso
fonte
1

Eu sei que esta pergunta é muito antiga, mas toda vez que eu precisar desse código ... a propósito, se você tiver tabelas e exibições, Funções e PROCEDIMENTOS, você poderá excluir tudo por este script .. então por que eu postar esse script? porque se você excluir todas as tabelas, você precisará excluir todas as visualizações e, se tiver Funções e PROCEDIMENTOS, você também precisará excluí-las
. Espero que ajude alguém.

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
fonte