How to drop all tables from a database with one SQL query?

后端 未结 12 2072
盖世英雄少女心
盖世英雄少女心 2020-12-12 09:44

I don\'t want to type all tables\' name to drop all of them. Is it possible with one query?

相关标签:
12条回答
  • 2020-12-12 09:53

    You could also use the following script to drop everything, including the following:

    • non-system stored procedures
    • views
    • functions
    • foreign key constraints
    • primary key constraints
    • tables

    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
    
    0 讨论(0)
  • 2020-12-12 09:55

    If you want to use only one SQL query to delete all tables you can use this:

    EXEC sp_MSforeachtable @command1 = "DROP TABLE ?"
    

    This is a hidden Stored Procedure in sql server, and will be executed for each table in the database you're connected.

    Note: You may need to execute the query a few times to delete all tables due to dependencies.

    Note2: To avoid the first note, before running the query, first check if there foreign keys relations to any table. If there are then just disable foreign key constraint by running the query bellow:

    EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
    
    0 讨论(0)
  • 2020-12-12 09:56

    Use the INFORMATION_SCHEMA.TABLES view to get the list of tables. Generate Drop scripts in the select statement and drop it using 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
    

    Note: If you have any foreign Keys defined between tables then first run the below query to disable all foreign keys present in your database.

    EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
    

    For more information, check here.

    0 讨论(0)
  • 2020-12-12 09:59

    If anybody else had a problem with best answer's solution (including disabling foreign keys), here is another solution from me:

    -- 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'
    
    0 讨论(0)
  • 2020-12-12 09:59

    Not quite 1 query, still quite short and sweet:

    -- 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
    
    0 讨论(0)
  • 2020-12-12 10:01

    I Know this question is very old but every Time i need this code .. by the way if you have tables and views and Functions and PROCEDURES you can delete it all by this Script .. so why i post this Script ?? because if u delete all tables you will need to delete all views and if you have Functions and PROCEDURES you need to delete it too
    i Hope it will help someone

    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
    
    0 讨论(0)
提交回复
热议问题