Bagaimana cara menjatuhkan semua tabel dalam database SQL Server?

195

Saya mencoba menulis skrip yang benar-benar akan mengosongkan database SQL Server. Inilah yang saya miliki sejauh ini:

USE [dbname]
GO
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
EXEC sp_msforeachtable 'DELETE ?'

Ketika saya menjalankannya di Management Studio, saya mendapatkan:

Perintah berhasil diselesaikan.

tetapi ketika saya me-refresh daftar tabel, mereka semua masih ada di sana. Apa yang saya lakukan salah?

dixuji
sumber
Jika tidak ada solusi di halaman ini yang berfungsi, mungkin Anda lupa untuk: GUNAKAN [DatabaseName] GO
Serj Sagan
2
MENGHAPUS ? akan menghapus catatan dari tabel. Anda harus menggunakan DROP TABLE?, Namun itu tidak akan berfungsi karena alasan lain.
datagod

Jawaban:

306

Ini tidak berfungsi untuk saya ketika ada beberapa tabel kunci asing.
Saya menemukan kode yang berfungsi dan melakukan semua yang Anda coba (hapus semua tabel dari database Anda):

DECLARE @Sql NVARCHAR(500) DECLARE @Cursor CURSOR

SET @Cursor = CURSOR FAST_FORWARD FOR
SELECT DISTINCT sql = 'ALTER TABLE [' + tc2.TABLE_SCHEMA + '].[' +  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

Anda dapat menemukan pos di sini . Ini adalah posting oleh Groker.

Gabriel GM
sumber
Mengapa ketika Anda mencoba untuk membungkus seluruh blok kode dalam pernyataan IF menggunakan blok BEGIN-END yang dikeluhkannya tentang kursor?
Adam
11
Saya mendapatkan kesalahanCould not find stored procedure 'sp_MSForEachTable'.
Korayem
2
Jawaban ini tidak berfungsi jika Anda memiliki tabel (dengan kendala) dalam skema yang berbeda dari dbo. Jika Anda memiliki skema khusus, Anda perlu mengubah sqlke:SELECT DISTINCT sql = 'ALTER TABLE [' + tc2.CONSTRAINT_SCHEMA + '].[' + tc2.TABLE_NAME + '] DROP [' + rc1.CONSTRAINT_NAME + ']'
Asbjørn Ulsberg
5
sp_MSforeachtabletidak tersedia di Azure. Gunakan jawaban @ CountZero sebagai gantinya.
Ogglas
3
Menemukan referensi ini di web (bukan milik saya): Salinan sp_MSFormat Prosedur Tersimpan Untuk Azure, Menggunakan sp_MSforeach_worker: gist.github.com/metaskills/893599 .
João Vieira
333

Anda juga dapat menghapus semua tabel dari database hanya menggunakan alat MSSMS UI (tanpa menggunakan skrip SQL). Terkadang cara ini bisa lebih nyaman (terutama jika dilakukan sesekali)

Saya melakukan langkah demi langkah sebagai berikut:

  1. Pilih 'Tabel' pada pohon basis data (Object Explorer)
  2. Tekan F7 untuk membuka tampilan Rincian Obyek Explorer
  3. Dalam tampilan ini pilih tabel yang harus dihapus (dalam hal ini semuanya)
  4. Terus tekan Hapus sampai semua tabel telah dihapus (Anda mengulanginya sebanyak jumlah kesalahan karena kendala / dependensi utama)
Bronek
sumber
5
Saya tidak bisa mendapatkan sp_msforeachtable untuk bekerja pada Azure sql db. Saya kira mereka tidak memasukkannya untuk Azure. Solusi ini sangat bagus dan sempurna ketika mengejek atau membuat banyak perubahan (memulai kembali) dengan migrasi EF.
trevorc
Tidak mempertimbangkan FK / pesanan.
Josh
1
ini adalah metode praktis jika Anda hanya perlu melakukannya di sana-sini, skrip mungkin lebih baik jika Anda sering melakukannya.
Dylan Hayes
2
@Josh pesanan tidak dianggap tetapi jika Anda terus menekan Ok di dialog Hapus itu akan terus menghapus semua tabel yang bisa, yang pada akhirnya akan menghapus semua tabel.
clayRay
Solusi Sempurna menggunakan Desainer
Zaheer
49

Dalam SSMS:

  • Klik kanan database
  • Pergi ke "Tugas"
  • Klik "Buat Skrip"
  • Di bagian "Pilih Objek", pilih "Script seluruh database dan semua objek basis data"
  • Di bagian "Tetapkan Opsi Scripting", klik tombol "Advanced"
  • Pada "Script DROP dan BUAT" beralih "Script BUAT" ke "Script DROP" dan tekan OK
  • Kemudian, simpan ke file, clipboard, atau jendela permintaan baru.
  • Jalankan skrip.

Sekarang, ini akan menghapus semuanya, termasuk database. Pastikan untuk menghapus kode untuk item yang tidak ingin Anda jatuhkan. Atau, di bagian "Pilih Objek", alih-alih memilih untuk skrip seluruh database, cukup pilih item yang ingin Anda hapus.

Ben
sumber
3
Jika Anda tidak ingin menjatuhkan basis data (yang dalam kasus saya saya tidak lakukan karena saya perlu membuat panggilan dukungan untuk membuatnya dibuat) kemudian gunakan 'Pilih objek database tertentu' dan pilih semua jenis objek yang Anda ingin menjatuhkan.
d219
3
Ini cara termudah.
Asiri Dissanayaka
2
Ini pasti jawabannya!
Zac Taylor
34

deletedigunakan untuk menghapus baris dari sebuah tabel. Anda harus menggunakannya drop tablesebagai gantinya.

EXEC sp_msforeachtable 'drop table [?]'
DaveShaw
sumber
Itu tampaknya telah memperbaiki masalah tidak memiliki kesalahan, tapi sekarang saya mengalami kesalahan kendala. Apakah sintaksis NOCHECK CONSTRAINTbaris saya salah?
dixuji
1
Saya menggunakan ini pada tabel 2 cepat dengan FK dan itu berhasil. EXEC sp_msforeachtable 'ALTER TABLE? NOCHECK CONSTRAINT all '
DaveShaw
12
Ini hanya berfungsi untuk saya setelah saya menghapus tanda kurung siku: EXEC sp_msforeachtable 'drop table?'.
LPains
Pada SQL Server Anda memerlukan tanda kurung jika ada nama tabel yang memiliki karakter atau spasi aneh. Saya tidak tahu versi SQL Server yang tidak mendukung tanda kurung di sekitar nama objek.
DaveShaw
Pada SQL Server 2012 (11.x) saya juga harus menghapus tanda kurung.
Frieder
30

Jawaban yang diterima tidak mendukung Azure. Ini menggunakan prosedur tersimpan tanpa dokumen "sp_MSforeachtable". Jika Anda mendapatkan kesalahan "azure tidak dapat menemukan prosedur tersimpan 'sp_msforeachtable" saat menjalankan atau hanya ingin menghindari mengandalkan fitur tidak berdokumen (yang dapat dihapus atau fungsinya diubah pada titik mana pun), cobalah di bawah ini.

Versi ini mengabaikan tabel histori migrasi kerangka kerja entitas "__MigrationHistory" dan "database_firewall_rules" yang merupakan tabel Azure Anda tidak akan memiliki izin untuk menghapus.

Diuji ringan pada Azure. Periksa untuk membuat ini tidak memiliki efek yang tidak diinginkan pada lingkungan Anda.

DECLARE @sql NVARCHAR(2000)

WHILE(EXISTS(SELECT 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE='FOREIGN KEY'))
BEGIN
    SELECT TOP 1 @sql=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']')
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
    EXEC(@sql)
    PRINT @sql
END

WHILE(EXISTS(SELECT * from INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME != '__MigrationHistory' AND TABLE_NAME != 'database_firewall_rules'))
BEGIN
    SELECT TOP 1 @sql=('DROP TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + ']')
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME != '__MigrationHistory' AND TABLE_NAME != 'database_firewall_rules'
    EXEC(@sql)
    PRINT @sql
END

Diambil dari:

https://edspencer.me.uk/2013/02/25/drop-all-tables-in-a-sql-server-database-azure-friendly/

http://www.sqlservercentral.com/blogs/sqlservertips/2011/10/11/remove-all-foreign-keys/

CountZero
sumber
3
Bekerja sebagai sihir pada warna biru. Jauh lebih cepat daripada menghapus melalui UI VS
Simeon Grigorovich
27
/* 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
Harpal
sumber
1
Bekerja dalam SQL Azure :) sp_MSforeachtable tidak bekerja di sana
Pavel Biryukov
Sebagai catatan, ini akan gagal jika Anda memiliki skema non-dbo (mis. Jika Anda menggunakan Hangfire)
Liam Dawson
21

Anda hampir benar, gunakan sebaliknya:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
EXEC sp_msforeachtable 'DROP TABLE ?'

tetapi baris kedua Anda mungkin perlu menjalankan lebih dari sekali sampai Anda berhenti mendapatkan kesalahan:

Could not drop object 'dbo.table' because it is referenced by a FOREIGN KEY constraint.

Pesan:

Command(s) completed successfully.

berarti semua tabel berhasil dihapus.

Michał Powaga
sumber
17

Pendek dan manis:

USE YOUR_DATABASE_NAME
-- 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
2
Saya harus mengganti sp_msforeachtableoleh sp_MSforeachtabledan akan sangat menyarankan untuk menambahkan use yourdatabasesebagai baris pertama. Bekerja seperti pesona.
Simon Sobisch
Pendek dan manis! Thnx.
sapatelbaps
7

Cara berpuasa adalah:

  1. Diagram Basis Data Baru
  2. Tambahkan semua tabel
  3. Ctrl + A untuk memilih semua
  4. Klik Kanan "Hapus dari Database"
  5. Ctrl + S untuk menyimpan
  6. Nikmati
TuanDPH
sumber
Sejauh ini, ini adalah cara tercepat, lebih mudah untuk melakukan kesalahan. Ini harus menjadi jawaban yang diterima.
DARKG Beli
6

Sepertinya perintah harus tanpa selimut persegi

EXEC sp_msforeachtable 'drop table ?'
Jimmy Wong
sumber
6

Bagi saya, cara termudah:

--First delete all constraints

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';

SELECT @sql = @sql + N'
ALTER TABLE ' + QUOTENAME(s.name) + N'.'
+ QUOTENAME(t.name) + N' DROP CONSTRAINT '
+ QUOTENAME(c.name) + ';'
FROM sys.objects AS c
INNER JOIN sys.tables AS t
ON c.parent_object_id = t.[object_id]
INNER JOIN sys.schemas AS s 
ON t.[schema_id] = s.[schema_id]
WHERE c.[type] IN ('D','C','F','PK','UQ')
ORDER BY c.[type];

EXEC sys.sp_executesql @sql;

-- Then drop all tables

exec sp_MSforeachtable 'DROP TABLE ?'
Jeffrey
sumber
2

Temukan !!

Anda dapat menggunakan kueri di bawah ini untuk menghapus semua tabel dari database

EXEC sp_MSforeachtable @ command1 = "DROP TABLE?"

Selamat coding!

Gajanan Kulkarni
sumber
1

Bagaimana kalau menjatuhkan seluruh database lalu membuatnya lagi? Ini bekerja untuk saya.

DROP DATABASE mydb;
CREATE DATABASE mydb;
Chong Lip Phang
sumber
Apakah Anda tidak perlu meledakkan file mdf & ldf di antaranya?
ruffin
Saya menggunakan penyedia host web dan saya tidak terlalu yakin tentang itu. Saya pikir file-file itu akan dihapus secara otomatis ketika Anda menjatuhkan database, kecuali jika Anda sedang offline.
Chong Lip Phang
2
Itu benar-benar tergantung keadaan. Dalam kasus saya, saya tidak memiliki prosedur tersimpan dan metode ini berfungsi dengan baik untuk saya. Saya tidak akan menulis kode kompleks yang menjangkau puluhan baris ketika dua baris akan dilakukan. Saya tidak berpikir jawaban saya membenarkan downvote karena saya menawarkan saran kepada kelompok pengguna tertentu.
Chong Lip Phang
0

Saya tahu ini adalah posting lama sekarang tetapi saya telah mencoba semua jawaban di sini pada banyak database dan saya telah menemukan mereka semua bekerja kadang-kadang tetapi tidak semua waktu untuk berbagai (saya hanya dapat mengasumsikan) kebiasaan SQL Server.

Akhirnya saya menemukan ini. Saya sudah menguji ini di mana-mana (secara umum) saya bisa dan berhasil (tanpa prosedur toko tersembunyi).

Sebagai catatan sebagian besar pada SQL Server 2014. (tetapi sebagian besar versi lain saya mencobanya juga tampaknya berfungsi dengan baik).

Saya telah mencoba sementara loop dan nulls dll, kursor dan berbagai bentuk lainnya tetapi mereka selalu gagal pada beberapa database tetapi tidak pada yang lain tanpa alasan yang jelas.

Mendapatkan hitungan dan menggunakannya untuk beralih sepertinya selalu bekerja pada semua yang telah saya uji.

USE [****YOUR_DATABASE****]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- Drop all referential integrity constraints --
-- Drop all Primary Key constraints.          --

DECLARE @sql  NVARCHAR(296)
DECLARE @table_name VARCHAR(128)

DECLARE @constraint_name VARCHAR(128)
SET @constraint_name = ''

DECLARE @row_number INT

SELECT @row_number = Count(*) FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME = rc1.CONSTRAINT_NAME

WHILE @row_number > 0
BEGIN
    BEGIN
        SELECT TOP 1 @table_name = tc2.TABLE_NAME, @constraint_name = rc1.CONSTRAINT_NAME FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
        LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME = rc1.CONSTRAINT_NAME
        AND rc1.CONSTRAINT_NAME > @constraint_name
        ORDER BY rc1.CONSTRAINT_NAME
        SELECT @sql = 'ALTER TABLE [dbo].[' + RTRIM(@table_name) +'] DROP CONSTRAINT [' + RTRIM(@constraint_name)+']'
        EXEC (@sql)
        PRINT 'Dropped Constraint: ' + @constraint_name + ' on ' + @table_name
        SET @row_number = @row_number - 1
    END
END
GO

-- Drop all tables --

DECLARE @sql  NVARCHAR(156)
DECLARE @name VARCHAR(128)
SET @name = ''

DECLARE @row_number INT

SELECT @row_number = Count(*) FROM sysobjects WHERE [type] = 'U' AND category = 0

WHILE @row_number > 0
BEGIN
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name])
    SELECT @sql = 'DROP TABLE [dbo].[' + RTRIM(@name) +']'
    EXEC (@sql)
    PRINT 'Dropped Table: ' + @name
    SET @row_number = @row_number - 1
END
GO
William Humphreys
sumber
0

Untuk Tabel Temporal sedikit lebih rumit karena mungkin ada beberapa kunci asing dan juga pengecualian:

Drop table operation failed on table XXX because it is not a supported operation on system-versioned temporal tables

Yang dapat Anda gunakan adalah:

-- Disable constraints (foreign keys)
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO

-- Disable system versioning (temporial tables)
EXEC sp_MSForEachTable '
 IF OBJECTPROPERTY(object_id(''?''), ''TableTemporalType'') = 2
  ALTER TABLE ? SET (SYSTEM_VERSIONING = OFF)
'
GO

-- Removing tables
EXEC sp_MSForEachTable 'DROP TABLE ?'
GO
J. Wincewicz
sumber