Bir SQL Server veritabanındaki tüm tablolar nasıl bırakılır?


195

Tamamen SQL Server veritabanını boşaltacak bir komut dosyası yazmaya çalışıyorum. Şimdiye kadar sahip olduğum şey bu:

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

Management Studio'da çalıştırdığımda şunu elde ederim:

Komut (lar) başarıyla tamamlandı.

ama tablo listesini yenilediğimde hepsi hala orada. Neyi yanlış yapıyorum?


Bu sayfadaki çözümlerin hiçbiri çalışmıyorsa, belki de şunu unuttunuz: [DatabaseName] GO
Serj Sagan

2
Silinsin mi? kayıtları tablodan siler. DROP TABLE? Kullanıyor olmalısınız, ancak bu başka nedenlerle çalışmaz.
datagod

Yanıtlar:


306

Birden fazla yabancı anahtar tablosu olduğunda da benim için çalışmıyor.
Çalıştığınız ve denediğiniz her şeyi yapan kodu buldum (veritabanınızdan tüm tabloları silin):

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

Gönderiyi burada bulabilirsiniz . Bu Groker tarafından gönderilen yazıdır.


Bu kod bloğunun tamamını, imleç hakkında şikayet ettiği bir BEGIN-END bloğu kullanarak bir IF deyimine sarmaya çalıştığınızda neden oluyor?
Adam

11
Hata alıyorumCould not find stored procedure 'sp_MSForEachTable'.
Korayem

2
Farklı bir şemada tablolarınız (kısıtlı) varsa bu yanıt çalışmaz dbo. Özel şemalarınız varsa, şunu değiştirmeniz gerekir sql:SELECT DISTINCT sql = 'ALTER TABLE [' + tc2.CONSTRAINT_SCHEMA + '].[' + tc2.TABLE_NAME + '] DROP [' + rc1.CONSTRAINT_NAME + ']'
Asbjørn Ulsberg

5
sp_MSforeachtableAzure'da kullanılamıyor. Bunun yerine @ CountZero'nun yanıtını kullanın.
Ogglas

3
Bu referansı web'de buldum (benim değil): Azure için sp_MSforeachtable Stored Yordamının Bir Kopyası, sp_MSforeach_worker: gist.github.com/metaskills/893599 kullanır .
João Vieira

333

Tüm tabloları veritabanından yalnızca MSSMS UI araçlarını (SQL komut dosyası kullanmadan) silebilirsiniz. Bazen bu şekilde daha rahat olabilir (özellikle ara sıra yapılırsa)

Bunu adım adım şu şekilde yapıyorum:

  1. Veritabanı ağacında 'Tablolar'ı seçin (Nesne Gezgini)
  2. Nesne Gezgini Ayrıntıları görünümünü açmak için F7 tuşuna basın
  3. Bu görünümde silinmesi gereken tabloları seçin (bu durumda tümü)
  4. Tüm tablolar silinene kadar Sil'e basmaya devam edin (anahtar kısıtlamaları / bağımlılıkları nedeniyle hataların sayısını tekrarlayın)

5
Azure sql db üzerinde çalışmak için sp_msforeachtable alamadım. Sanırım Azure'a dahil etmediler. Bu çözüm harika çalışıyor ve EF geçişleriyle alay ederken veya çok fazla değişiklik yaparken (baştan başlayarak) mükemmeldir.
trevorc

FK / siparişi dikkate almaz.
Josh

1
Bu burada ve orada yapmanız gerekiyorsa kullanışlı bir yöntemdir, sık sık yapıyorsanız komut dosyası daha iyi olabilir.
Dylan Hayes

2
@Siparişin önemi dikkate alınmaz, ancak Sil iletişim kutusunda Tamam tuşuna basmaya devam ederseniz, tüm tabloları silmeye devam eder ve sonunda tüm tabloları siler.
ClayRay

Designer'ı kullanarak Mükemmel Çözüm
Zaheer

49

SSMS'de:

  • Veritabanına sağ tıklayın
  • "Görevler" e gidin
  • "Komut Dosyaları Oluştur" u tıklayın
  • "Nesneleri Seç" bölümünde, "Tüm veritabanını ve tüm veritabanı nesnelerini komut dosyası oluştur" u seçin
  • "Komut Dosyası Seçeneklerini Ayarla" bölümünde "Gelişmiş" düğmesini tıklayın
  • "Script DROP and CREATE" de "Script CREATE" i "Script DROP" olarak değiştirin ve OK tuşuna basın
  • Ardından, dosyaya, panoya veya yeni sorgu penceresine kaydedin.
  • Komut dosyasını çalıştırın.

Şimdi, bu veritabanı dahil her şeyi bırakacaktır. Bırakılmasını istemediğiniz öğelerin kodunu kaldırdığınızdan emin olun. Alternatif olarak, "Nesneleri Seç" bölümünde, tüm veritabanını kodlamayı seçmek yerine kaldırmak istediğiniz öğeleri seçin.


3
Veritabanını bırakmak istemiyorsanız (ki benim durumumda oluşturmam için bir destek çağrısı yapmam gerekiyordu) sonra 'Belirli veritabanı nesnelerini seç' seçeneğini kullanın ve tüm nesne türlerini seçin düşmek istiyorsun.
d219

3
Bu en kolay yol.
Asiri Dissanayaka

2
Kesin cevap bu olmalı!
Zac Taylor

34

deletetablodan satır silmek için kullanılır. Bunun drop tableyerine kullanmalısınız .

EXEC sp_msforeachtable 'drop table [?]'

Bu, herhangi bir hata olmaması sorununu çözmüş gibiydi, ancak şimdi kısıtlama hatalarıyla karşılaşıyorum. Satırımın sözdizimi NOCHECK CONSTRAINTyanlış mı?
dixuji

1
Bu FK ile hızlı bir 2 tablolarda kullanılan ve çalıştı. EXEC sp_msforeachtable 'ALTER TABLE? NOCHECK CONSTRAINT all '
DaveShaw

12
Bu sadece köşeli parantez kaldırıldıktan sonra benim için çalıştı: EXEC sp_msforeachtable 'drop table?'.
LPains

Herhangi bir tablo adında tuhaf karakterler veya boşluklar varsa SQL Server'da parantez gerekir. Nesne adları etrafında parantez desteklemeyen bir SQL Server sürümünü bilmiyordum.
DaveShaw

SQL Server 2012 (11.x) üzerinde de köşeli ayraç kaldırmak zorunda kaldı.
Frieder

30

Kabul edilen cevap Azure'u desteklemiyor. Belgelendirilmemiş bir saklı yordam "sp_MSforeachtable" kullanır. Çalışırken bir "azure saklı yordamı 'sp_msforeachtable" hatası bulamadıysanız veya basitçe belgelenmemiş özelliklere (bu özellik kaldırılabilir veya işlevleri herhangi bir noktada değişmiş olabilir) güvenmekten kaçınmak istiyorsanız, aşağıdakileri deneyin.

Bu sürüm, "__MigrationHistory" varlık çerçevesi taşıma geçmişi tablosunu ve silme izniniz olmayacak bir Azure tablosu olan "database_firewall_rules" değerini yok sayar.

Azure üzerinde hafifçe test edildi. Bunun ortamınız üzerinde istenmeyen etkileri olmadığını kontrol edin.

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

Den alınan:

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/


3
Masmavi üzerinde büyü olarak çalıştı. VS'nin kullanıcı arayüzü üzerinden kaldırma işleminden çok daha hızlı
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

1
SQL Azure'da çalışıyor :) sp_MSforeachtable orada çalışmıyor
Pavel Biryukov

Not olarak, dbo olmayan şemalarınız varsa (örneğin Hangfire kullanıyorsanız) bu başarısız olur
Liam Dawson

21

Neredeyse haklısın, bunun yerine şunu kullan:

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

ancak ikinci satır, hata almayı durdurana kadar bir kereden fazla yürütmeniz gerekebilir:

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

İleti:

Command(s) completed successfully.

tüm tablonun başarıyla silindiği anlamına gelir.


17

Kısa ve güzel:

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

2
Ben değiştirmek zorunda sp_msforeachtabletarafından sp_MSforeachtableve son derece bir ekleme öneriyoruz use yourdatabaseilk satırı olarak. Bir cazibe gibi çalıştı.
Simon Sobisch

Kısa ve güzel! Thnx.
sapatelbaps

7

Oruçlu yol:

  1. Yeni Veritabanı Diyagramları
  2. Tüm tabloyu ekle
  3. Tümünü seçmek için Ctrl + A
  4. "Veritabanından Kaldır" ı sağ tıklayın
  5. Kaydetmek için Ctrl + S
  6. Zevk almak

Bu, bunu yapmanın en hızlı, daha az hataya açık yoludur. Bu kabul edilen cevap olmalı.
DARKGuy

6

Komuta kare battaniye olmadan olmalı

EXEC sp_msforeachtable 'drop table ?'

6

Benim için en kolay yol:

--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 ?'

2

Nokta !!

Tüm tabloları veritabanından kaldırmak için aşağıdaki sorguyu kullanabilirsiniz

EXEC sp_MSforeachtable @ command1 = "TABLO DAMLA?"

Mutlu kodlama!


1

Tüm veritabanını bırakıp tekrar oluşturmaya ne dersiniz? Bu benim için çalışıyor.

DROP DATABASE mydb;
CREATE DATABASE mydb;

Aralarında mdf & ldf dosyalarını patlatmanıza gerek yok mu?
ruffin

Bir web barındırma sağlayıcısı kullanıyorum ve bu konuda çok emin değilim. Çevrimdışı olmadığınız sürece bir veritabanını bıraktığınızda bu dosyaların otomatik olarak silineceğini düşünüyorum.
Chong Lip Phang

2
Gerçekten koşullara bağlı. Benim durumumda, saklı yordamlar yok ve bu yöntem benim için iyi çalışıyor. İki satır ne zaman onlarca satır kapsayan karmaşık kodları yazmayacağım. Belirli bir kullanıcı grubuna öneri sunduğumdan cevabımın bir aşağı oyu haklı görmediğini düşünüyorum.
Chong Lip Phang

0

Bu eski bir yazı olduğunu biliyorum ama burada veritabanları çok sayıda tüm cevapları denedim ve hepsi bazen çalışıyor ama SQL Server çeşitli (sadece varsayabilirim) her zaman değil bulduk.

Sonunda bunu buldum. Bunu her yerde test ettim (genel olarak konuşursak) ve çalışır (herhangi bir gizli mağaza prosedürü olmadan).

Not için çoğunlukla SQL Server 2014. (ancak denedim diğer sürümlerin çoğu da iyi çalıştı gibi görünüyor).

Döngüler ve nulls vs vs, imleçler ve çeşitli diğer formları denedim ama onlar her zaman bazı veritabanlarında başarısız gibi görünüyor ama hiçbir belirgin nedeni yok.

Bir sayım elde etmek ve bunu yinelemek için kullanmak her zaman test ettiğim her şey üzerinde çalışıyor gibi görünüyor.

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

0

İçin Geçici Tablolar biraz daha gerçeğine bazı yabancı anahtarları ve ayrıca istisna olabilir nedeniyle komplike geçerli:

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

Ne kullanabilirsiniz:

-- 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.