sqlsql-server

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


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


Solution

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