Bagaimana cara menjatuhkan semua tabel dari database dengan satu query SQL?

176

Saya tidak ingin mengetikkan nama semua tabel untuk menghapus semuanya. Apakah mungkin dengan satu permintaan?

Majid
sumber
3
Beberapa googling cepat mengungkapkan ini: stackoverflow.com/questions/11053116/...
JSK NS
-Hanya (untuk SQLServer) ini mungkin lebih berguna: stackoverflow.com/questions/536350/…
Dengan nama pengguna yang tepat, ini bisa terjadi secara otomatis ( tautan xkcd wajib ).
Minnow
11
Apakah Anda memiliki kunci asing di atas tabel dalam database? Jika demikian, Anda harus mempertimbangkannya, dan menjatuhkannya sebelum mencoba menjatuhkan tabel.
Anthony Grist
Ingatlah bahwa jika Anda memiliki objek schemabound, Anda tidak bisa menjatuhkan tabel.
Sean Lange

Jawaban:

177

Gunakan tampilan INFORMATION_SCHEMA.TABLES untuk mendapatkan daftar tabel. Hasilkan skrip Drop dalam pernyataan pilih dan jatuhkan menggunakan 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

Catatan: Jika Anda memiliki foreign Keysdefinisi di antara tabel, pertama jalankan query di bawah ini untuk menonaktifkan semua yang foreign keysada di database Anda.

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

Untuk informasi lebih lanjut, periksa di sini .

P ரதீப்
sumber
3
(bukan downvote saya) ... saya biasanya tetap dengan [sys]pandangan skema jika portabilitas di rdbms 'tidak diperlukan. stackoverflow.com/a/3654313/251174
swasheck
1
@DoubleA - Ini sangat sederhana. Pertama saya membangun pernyataan Drop untuk semua tabel di database saya dan menyimpannya ke dalam variabel. Untuk memeriksa ini, Anda dapat menggunakan Print @sqlsebelumnya exec. Kemudian saya mengeksekusi drop statement yang dibangun secara dinamis melaluisp_executesql
P
2
Jika Anda menggunakan Azure, sp_msforeachtable tidak tersedia. Saya menemukan nugget manis ini dari @Aaron Bertrand untuk menghapus semua batasan FK. Bekerja sangat baik dengan jawaban ini. dba.stackexchange.com/questions/90033/…
trevorc
3
Jika sp_msforeachtable tidak tersedia, Anda juga dapat menjalankan kueri penghapusan beberapa kali, karena tabel yang bergantung pada orang lain kemudian dihapus :)
Maarten Kieft
88

Jika Anda ingin menggunakan hanya satu query SQL untuk menghapus semua tabel Anda bisa menggunakan ini:

EXEC sp_MSforeachtable @command1 = "DROP TABLE ?"

Ini adalah Prosedur Tersimpan tersembunyi di sql server, dan akan dieksekusi untuk setiap tabel dalam database yang Anda terhubung.

Catatan: Anda mungkin perlu menjalankan kueri beberapa kali untuk menghapus semua tabel karena dependensi.

Note2: Untuk menghindari catatan pertama, sebelum menjalankan kueri, periksa dulu apakah ada kunci asing yang terkait dengan tabel apa pun. Jika ada maka cukup nonaktifkan batasan kunci asing dengan menjalankan kueri di bawah ini:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
Kemarahan terhadap mesin
sumber
1
Saya mencobanya di database Azure SQL saya, dan tidak berhasil. Namun jawaban di atas (oleh Prdp) berhasil.
Artemious
4
Untuk catatan samping, saya perlu menjalankan perintah pertama beberapa kali sebelum menjatuhkan semua tabel tetapi berfungsi dengan baik.
Alper
1
@ Thatshowweroll itu mungkin karena dependensi tabel. Jika satu tabel memiliki yang lain yang bergantung padanya tidak dapat dihapus.
RageAgainstTheMachine
1
@RageAgainstTheMachine ya pasti dari tabel dengan beberapa dependensi silang. Saya ingin memberi tahu pengguna untuk menjalankannya beberapa kali, kesalahan bukan masalah. Jalankan perintah pertama 3-4 kali lalu perintah kedua 1 kali dan BOM. Itu bekerja seperti pesona!
Alper
1
@KyleVassella ya, ini hanya akan dijalankan pada database di mana Anda memiliki konsol terbuka
RageAgainstTheMachine
39

Jika Anda tidak ingin mengetik, Anda dapat membuat pernyataan dengan ini:

USE Databasename

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

Kemudian salin dan tempel ke jendela SSMS baru untuk menjalankannya.

Dave. Gugg
sumber
nama tabel harus dibungkus [], tetapi berfungsi dengan baik bahkan pada Azure
Ondra
1
Kita juga bisa menggunakan QUOTENAMEyang terlihat rapi. 'DROP TABLE ' + QUOTENAME(name) + ';'
P ரதீப்
13

Anda juga dapat menggunakan skrip berikut untuk menghapus semuanya, termasuk yang berikut:

  • prosedur tersimpan non-sistem
  • dilihat
  • fungsi
  • batasan kunci asing
  • kendala kunci utama
  • meja

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

Saya hanya akan membuat perubahan kecil ke jawaban @ NoDisplayName dan digunakan QUOTENAME()pada TABLE_NAMEkolom dan juga termasuk TABLE_SCHEMAkolom membungkus tabel tidak dalam dboskema.

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;

Atau menggunakan systampilan skema (sesuai komentar @ 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
sumber
4
Saya biasanya akan tetap dengan [sys]pandangan skema jika portabilitas di rdbms 'tidak diperlukan. stackoverflow.com/a/3654313/251174
swasheck
1
@swasheck Terima kasih atas tautannya yang cukup menarik. Saya telah memperbarui jawabannya dengan solusi menggunakan tampilan skema sys.
AeroX
Anda dapat menggunakan fungsi Schema_name () untuk mendapatkan nama skema alih-alih bergabung dengan msdn.microsoft.com/en-us/library/ms175068.aspx
P ரதீப்
@NoDisplayName Hanya karena Anda bisa , bukan berarti Anda harus ... blogs.sqlsentry.com/aaronbertrand/…
Aaron Bertrand
@ AaronBertrand - Pikiran buruk saya bisa menjadi cara yang lebih baik. terima kasih telah menunjukkannya.
P ரதீப்
9

Sebagai tindak lanjut jawaban Dave.Gugg, ini akan menjadi kode yang diperlukan seseorang untuk mendapatkan semua baris DROP TABLE di MySQL:

SELECT CONCAT('DROP TABLE ', TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.tables
WHERE TABLE_SCHEMA = 'your_database_name'
OMA
sumber
2
Saya tahu poster aslinya melabeli pertanyaan dengan "sql-server", tetapi ini mungkin berguna bagi seseorang yang ingin melakukan ini di MySQL. Sebenarnya saya menemukan pertanyaan ini ketika mencari solusi MySQL untuk pertanyaan ini, jadi saya sekarang membagikan solusi yang saya temukan setelah membaca salah satu jawaban di sini.
OMA
7

Cara paling sederhana adalah dengan menjatuhkan seluruh basis data dan membuatnya sekali lagi:

drop database db_name
create database db_name

Itu saja.

Pengawasan
sumber
1
:) setidaknya bagi saya tujuan menjatuhkan semua tabel adalah karena basis data tidak dapat dihapus
Hasan Zafari
5
jangan jalankan perintah ini di basis data perusahaan. Atau bersiaplah untuk mencari pekerjaan lain.
Faraz
@FarazDurrani lelaki mudah, menjatuhkan semua tabel sepertinya juga bukan kesepakatan untuk PROD db.
Pengawasan
5

Jika ada orang lain yang bermasalah dengan solusi jawaban terbaik (termasuk menonaktifkan kunci asing), berikut adalah solusi lain dari saya :

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

Tidak cukup 1 kueri, masih cukup pendek dan manis:

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

Gunakan skrip berikut untuk dropsemua 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

Kemudian jalankan yang berikut untuk menjatuhkan semua tabel:

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

Ini bekerja untuk saya di Azure SQL Database di mana 'sp_msforeachtable'tidak tersedia!

David Nyaoso
sumber
1

Saya Tahu pertanyaan ini sudah sangat lama tetapi setiap kali saya membutuhkan kode ini .. omong-omong jika Anda memiliki tabel dan tampilan dan Fungsi dan PROSEDUR Anda dapat menghapus semuanya dengan Script ini .. jadi mengapa saya memposting Script ini ?? karena jika Anda menghapus semua tabel, Anda perlu menghapus semua tampilan dan jika Anda memiliki Fungsi dan PROSEDUR, Anda juga perlu menghapusnya.
Saya harap ini akan membantu seseorang

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
sumber