Bir veritabanından tüm tabloları tek bir SQL sorgusu ile nasıl bırakabilirim?


176

Hepsini bırakmak için tüm tabloların adını yazmak istemiyorum. Tek bir sorgu ile mümkün mü?


3
Bazı hızlı googling bunu ortaya çıkardı: stackoverflow.com/questions/11053116/…
JSK NS

- her ne kadar (SQLServer için) bu daha yararlı olabilir: stackoverflow.com/questions/536350/…

Doğru kullanıcı adları ile bu otomatik olarak gerçekleşebilir ( zorunlu xkcd bağlantısı ).
Minnow

11
Veritabanındaki tablolarda yabancı anahtar var mı? Öyleyse, bunu dikkate almanız ve tabloları bırakmaya çalışmadan önce bunları bırakmanız gerekir.
Anthony Grist

Şemabound nesneleriniz varsa tabloyu bırakamayacağınızı unutmayın.
Sean Lange

Yanıtlar:


177

Tabloların listesini almak için BİLGİ_SCHEMA.TABLES görünümünü kullanın . Select deyiminde Drop komut dosyaları oluşturun ve Dynamic SQL kullanarak bırakın:

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 Sürümü

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

Not:foreign Keys Tablolar arasında herhangi bir tanımlıysanız , önce veritabanınızda bulunanların tümünü devre dışı bırakmak için aşağıdaki sorguyu çalıştırın foreign keys.

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

Daha fazla bilgi için buraya bakın .


3
(benim downvote değil) ... [sys]rdbms arasında taşınabilirlik gerekli değilse genellikle şema görünümleri ile sopa '. stackoverflow.com/a/3654313/251174
14'te swasheck


1
@DoubleA - Çok basit. Öncelikle veritabanımdaki tüm tablolar için Drop ifadeleri oluşturuyorum ve bunu bir değişkene kaydediyorum. Bunu kontrol etmek için daha Print @sqlönce kullanabilirsiniz exec. Sonra dinamik olarak oluşturulmuş drop ifadelerini sp_executesql
yürütüyorum

2
Azure kullanıyorsanız, sp_msforeachtable kullanılamaz. Bu tatlı külçeyi @Aaron Bertrand'dan tüm FK kısıtlamalarını silmek için buldum. Bu cevapla gerçekten iyi çalışıyor. dba.stackexchange.com/questions/90033/…
trevorc

3
Sp_msforeachtable kullanılamıyorsa, silme sorgusunu birden çok kez çalıştırabilirsiniz, çünkü başkalarına bağımlı tablolar silinir :)
Maarten Kieft

88

Tüm tabloları silmek için yalnızca bir SQL sorgusu kullanmak istiyorsanız bunu kullanabilirsiniz:

EXEC sp_MSforeachtable @command1 = "DROP TABLE ?"

Bu, sql sunucusunda gizli bir Saklı Yordamdır ve bağlı olduğunuz veritabanındaki her tablo için yürütülür.

Not: Bağımlılıklar nedeniyle tüm tabloları silmek için sorguyu birkaç kez yürütmeniz gerekebilir.

Not2: İlk nottan kaçınmak için, sorguyu çalıştırmadan önce, herhangi bir tablo ile yabancı anahtar ilişkisi olup olmadığını kontrol edin. Eğer varsa, aşağıdaki sorguyu çalıştırarak yabancı anahtar kısıtlamasını devre dışı bırakın:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

1
Azure SQL veritabanımda denedim ve işe yaramadı. Ancak yukarıdaki cevap (Prdp tarafından) işe yaradı.
Artemious

4
Yan not için, tüm tabloları bırakmadan önce birden çok kez ilk komutu çalıştırmak gerekir ama iyi çalışıyor.
Alper

1
@Thatshowweroll muhtemelen tabloların bağımlılıkları nedeniyle. Bir tabloda bağımlı olan başka bir tablo varsa silinemez.
RageAgainstTheMachine

1
@RageAgainstTheMachine evet kesinlikle çoklu çapraz bağımlılığı olan tablolardan. Kullanıcıları birden çok kez çalıştırmak için bilgilendirmek istiyorum, hatalar sorun değil. İlk komutu 3-4 kez, ikinci komutu 1 kez ve BOM'u çalıştırın. Cazibe gibi çalışır!
Alper

1
@KyleVassella evet, bu yalnızca konsolunuzun açık olduğu veritabanında yürütülür
RageAgainstTheMachine

40

Yazmak istemiyorsanız, ifadeleri şu şekilde oluşturabilirsiniz:

USE Databasename

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

Ardından kopyalayıp yeni bir SSMS penceresine yapıştırın.


tablo adı [] içine alınmalı, ancak Azure'da bile harika çalışıyor
Ondra

1
QUOTENAMEDüzgün görünen de kullanabiliriz . 'DROP TABLE ' + QUOTENAME(name) + ';'
P ரதீப்

13

Aşağıdakiler de dahil olmak üzere her şeyi bırakmak için aşağıdaki komut dosyasını da kullanabilirsiniz:

  • sistem dışı saklı yordamlar
  • Görüntüleme
  • fonksiyonlar
  • yabancı anahtar kısıtlamaları
  • birincil anahtar kısıtlamaları
  • tablolar

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

9

Ben sadece @ NoDisplayName cevabını ve sütun QUOTENAME()üzerinde küçük bir değişiklik yapmak TABLE_NAMEve ayrıca şemada TABLE_SCHEMAtablolar encase sütun içerir dbo.

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;

Veya sysşema görünümlerini kullanarak (@ swasheck'in yorumuna göre):

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;

4
[sys]rdbms arasında taşınabilirlik gerekli değilse genellikle şema görünümleri ile sopa '. stackoverflow.com/a/3654313/251174
Aralık'ta swasheck

1
@swasheck Oldukça ilginç olan bağlantı için teşekkürler. Cevabı sys şema görünümlerini kullanarak bir çözümle güncelledim.
AeroX

Şema adını almak için Schema_name () işlevini kullanarak msdn.microsoft.com/en-us/library/ms175068.aspx
P ரதீப்

@NoDisplayName Sadece yapabileceğiniz için , yapmanız gereken anlamına gelmez ... blogs.sqlsentry.com/aaronbertrand/…
Aaron Bertrand

@AaronBertrand - Kötü düşüncemin daha iyi bir yol olabileceğini düşündüm. işaret ettiğiniz için teşekkürler.
P ரதீப்

9

Dave.Gugg'un cevabının bir takibi olarak, bu, birinin MySQL'deki tüm DROP TABLE satırlarını almak için ihtiyaç duyacağı kod olacaktır:

SELECT CONCAT('DROP TABLE ', TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.tables
WHERE TABLE_SCHEMA = 'your_database_name'

2
Soruyu "sql-server" ile etiketli orijinal posteri biliyorum, ama bu MySQL bunu yapmak isteyen biri için yararlı olabilir. Aslında bu soruya bir MySQL çözümü için googling yaparken bu soruyu buldum, şimdi burada cevaplardan birini okuduktan sonra geldiğim çözümü paylaşıyorum.
OMA

7

En basit yol tüm veritabanını bırakmak ve bir kez daha oluşturmaktır:

drop database db_name
create database db_name

Bu kadar.


1
:) en azından benim için tüm tabloları bırakma amacı veritabanı silinemez çünkü
Hasan Zafari

5
Bu komutu şirketin veritabanında çalıştırmayın. Veya başka bir iş bulmaya hazır olun.
Faraz

@FarazDurrani kolay adam, tüm tabloları bırakarak PROD db için bir anlaşma gibi görünmüyor.
Denetim

5

Başka birinin en iyi yanıtlayıcı çözümüyle (yabancı anahtarların devre dışı bırakılması dahil) bir sorunu varsa , benden başka bir çözüm :

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

3

Tam 1 sorgu değil, hala oldukça kısa ve tatlı:

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

3

Aşağıdaki komut dosyası kullan drophepsi 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

Ardından tüm tabloları bırakmak için aşağıdakileri çalıştırın:

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

Bu benim için 'sp_msforeachtable'kullanılabilir değildi Azure SQL Veritabanı benim için çalıştı !


1

Bu soru çok eski biliyorum ama her zaman ben bu koda ihtiyacım var .. Bu arada tablolar ve görünümler ve Fonksiyonlar ve PROSEDÜR varsa tüm bu Script tarafından silebilirsiniz .. neden bu Script sonrası ?? u tüm tabloları silerseniz tüm görünümleri silmek gerekir ve fonksiyonlar ve prosedürler varsa siz de silmek gerekmez çünkü
ben birine yardım edecek Umut

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