วิธีการวางตารางทั้งหมดจากฐานข้อมูลด้วยแบบสอบถาม SQL หนึ่ง?


176

ฉันไม่ต้องการพิมพ์ชื่อตารางทั้งหมดเพื่อลบทั้งหมด เป็นไปได้หรือไม่กับคำค้นหาเดียว?


3
googling อย่างรวดเร็วเปิดเผยสิ่งนี้: stackoverflow.com/questions/11053116/…
JSK NS

-although (สำหรับ SQLServer) สิ่งนี้อาจมีประโยชน์มากกว่า: stackoverflow.com/questions/536350/…

ด้วยชื่อผู้ใช้ที่ถูกต้องสิ่งนี้อาจเกิดขึ้นโดยอัตโนมัติ ( ลิงก์ xkcd บังคับ )
สร้อย

11
คุณมีกุญแจต่างประเทศในตารางในฐานข้อมูลหรือไม่? ถ้าเป็นเช่นนั้นคุณจะต้องคำนึงถึงสิ่งนั้นและวางสิ่งเหล่านั้นก่อนที่จะลองวางตาราง
Anthony Grist

โปรดทราบว่าหากคุณมีวัตถุ schemabound คุณไม่สามารถวางตาราง
Sean Lange

คำตอบ:


176

ใช้มุมมองINFORMATION_SCHEMA.TABLESเพื่อรับรายการของตาราง สร้างสคริปต์การวางในคำสั่งเลือกแล้วปล่อยโดยใช้ 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

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

หมายเหตุ:หากคุณมีการforeign Keysกำหนดไว้ระหว่างตารางก่อนอื่นให้เรียกใช้แบบสอบถามด้านล่างเพื่อปิดการใช้งานทั้งหมดที่foreign keysมีอยู่ในฐานข้อมูลของคุณ

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

สำหรับข้อมูลเพิ่มเติมโปรดตรวจสอบที่นี่


3
(ไม่ใช่ downvote ของฉัน) ... ฉันมักจะยึดติดกับ[sys]มุมมอง schema หากไม่จำเป็นต้องพกพาข้าม rdbms ' stackoverflow.com/a/3654313/251174
swasheck


1
@ DoubleA - มันง่ายมาก ก่อนอื่นฉันกำลังสร้างคำสั่ง Drop สำหรับตารางทั้งหมดในฐานข้อมูลของฉันและเก็บไว้ในตัวแปร การตรวจสอบนี้คุณสามารถใช้ก่อนPrint @sql execแล้วกำลังดำเนินการงบลดลงสร้างแบบไดนามิกผ่านsp_executesql
P ரதீப்

2
หากคุณใช้ Azure sp_msforeachtable จะไม่สามารถใช้งานได้ ฉันได้พบกับนักเก็ตหวานจาก @Aaron Bertrand เพื่อลบข้อ จำกัด FK ทั้งหมด ทำงานได้ดีจริงๆกับคำตอบนี้ dba.stackexchange.com/questions/90033/ …
trevorc

3
ถ้า sp_msforeachtable ไม่พร้อมใช้งานคุณสามารถเรียกใช้คิวรีการลบได้หลายครั้งเนื่องจากตารางที่ขึ้นอยู่กับบุคคลอื่นจะถูกลบ :)
Maarten Kieft

88

หากคุณต้องการใช้แบบสอบถาม SQL เพียงแบบสอบถามเดียวเพื่อลบตารางทั้งหมดคุณสามารถใช้สิ่งนี้:

EXEC sp_MSforeachtable @command1 = "DROP TABLE ?"

นี่เป็นขั้นตอนการจัดเก็บที่ซ่อนอยู่ในเซิร์ฟเวอร์ sql และจะถูกดำเนินการสำหรับแต่ละตารางในฐานข้อมูลที่คุณเชื่อมต่อ

หมายเหตุ:คุณอาจต้องดำเนินการแบบสอบถามสองสามครั้งเพื่อลบตารางทั้งหมดเนื่องจากการอ้างอิง

Note2:เพื่อหลีกเลี่ยงบันทึกย่อแรกก่อนเรียกใช้แบบสอบถามให้ตรวจสอบก่อนว่ามีคีย์ต่างประเทศสัมพันธ์กับตารางใด ๆ หรือไม่ หากมีอยู่แล้วให้ปิดการใช้งานข้อ จำกัด foreign key โดยการเรียกใช้คำสั่งร้อง:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

1
ฉันลองในฐานข้อมูล Azure SQL ของฉันแล้ว แต่ก็ไม่ทำงาน อย่างไรก็ตามคำตอบข้างต้น (โดย Prdp) ทำงาน
Artemious

4
สำหรับบันทึกด้านข้างฉันจำเป็นต้องเรียกใช้คำสั่งแรกหลายครั้งก่อนที่จะลดลงในตารางทั้งหมด แต่มันทำงานได้ดี
Alper

1
@Thatshowweroll นั่นอาจเป็นเพราะการขึ้นต่อกันของตาราง หากตารางหนึ่งมีตารางอื่นที่ขึ้นอยู่กับตารางนั้นจะไม่สามารถลบได้
RageAgainstTheMachine

1
@ RageAgainstTheMachine ใช่แน่นอนจากตารางที่มีการขึ้นต่อกันหลายอย่าง ฉันต้องการแจ้งให้ผู้ใช้เรียกใช้หลายครั้งข้อผิดพลาดไม่ใช่ปัญหา เรียกใช้คำสั่งแรก 3-4 ครั้งจากนั้นใช้คำสั่งที่สอง 1 ครั้งและ BOM มันใช้งานได้เหมือนมีเสน่ห์!
Alper

1
@KyleVassella ใช่สิ่งนี้จะทำงานบนฐานข้อมูลที่คุณเปิดคอนโซลไว้เท่านั้น
RageAgainstTheMachine

39

หากคุณไม่ต้องการพิมพ์คุณสามารถสร้างคำสั่งด้วยสิ่งนี้:

USE Databasename

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

จากนั้นคัดลอกและวางลงในหน้าต่าง SSMS ใหม่เพื่อเรียกใช้


ชื่อตารางควรอยู่ใน [] แต่ใช้ได้ดีแม้ใน Azure
Ondra

1
เราสามารถใช้QUOTENAMEซึ่งดูเรียบร้อย 'DROP TABLE ' + QUOTENAME(name) + ';'
P ரதீப்

13

คุณสามารถใช้สคริปต์ต่อไปนี้เพื่อวางทุกอย่างรวมถึงต่อไปนี้:

  • ขั้นตอนการจัดเก็บที่ไม่ใช่ระบบ
  • มุมมอง
  • ฟังก์ชั่น
  • ข้อ จำกัด คีย์ต่างประเทศ
  • ข้อ จำกัด คีย์หลัก
  • ตาราง

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

ฉันเพียงแค่ทำการเปลี่ยนแปลงเล็กน้อยในคำตอบของ @ NoDisplayName และใช้QUOTENAME()ในTABLE_NAMEคอลัมน์และรวมTABLE_SCHEMAคอลัมน์ไว้ในตารางที่ไม่ได้อยู่ใน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;

หรือใช้sysมุมมองสคีมา (ตามความคิดเห็นของ @ 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;

4
ฉันมักจะยึดติดกับ[sys]มุมมองคีถ้าไม่จำเป็นต้องพกพาข้าม rdbms ' stackoverflow.com/a/3654313/251174
swasheck

1
@swasheck ขอบคุณสำหรับลิงค์ที่น่าสนใจมาก ฉันได้อัพเดตคำตอบด้วยโซลูชันโดยใช้มุมมอง sys schema
AeroX

คุณสามารถใช้ Schema_name () ฟังก์ชั่นเพื่อรับชื่อ schema แทนการเข้าร่วมmsdn.microsoft.com/en-us/library/ms175068.aspx
P

@NoDisplayName เพียงเพราะคุณทำได้ไม่ได้หมายความว่าคุณควร ... blogs.sqlsentry.com/aaronbertrand/ ......
Aaron Bertrand

@AaronBertrand - ฉันคิดว่ามันอาจจะเป็นวิธีที่ดีกว่า ขอบคุณที่ชี้นำ
P ரதீப்

9

จากการติดตามของ Dave.Gugg คำตอบนี้จะเป็นรหัสที่ใครบางคนจะต้องได้รับ DROP Table ทุกบรรทัดใน MySQL:

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

2
ฉันรู้ว่าผู้โพสต์ดั้งเดิมมีคำถามกับ "sql-server" แต่สิ่งนี้อาจเป็นประโยชน์กับคนที่ต้องการทำสิ่งนี้ใน MySQL ในความเป็นจริงฉันพบคำถามนี้เมื่อ googling สำหรับโซลูชัน MySQL สำหรับคำถามนี้ดังนั้นตอนนี้ฉันแบ่งปันโซลูชันที่ฉันได้รับหลังจากอ่านคำตอบข้อใดข้อหนึ่งที่นี่
OMA

7

วิธีที่ง่ายที่สุดคือการวางฐานข้อมูลทั้งหมดและสร้างอีกครั้ง:

drop database db_name
create database db_name

นั่นคือทั้งหมดที่


1
:) อย่างน้อยสำหรับฉันจุดประสงค์ของการวางตารางทั้งหมดเป็นเพราะฐานข้อมูลไม่สามารถลบได้
Hasan Zafari

5
อย่าเรียกใช้คำสั่งนี้ในฐานข้อมูลของ บริษัท หรือพร้อมที่จะหางานใหม่
Faraz

@FarazDurrani คนง่าย ๆ การวางตารางทั้งหมดไม่ได้ดูเหมือนดีลสำหรับ PROD db เช่นกัน
กำกับดูแล

5

หากใครมีปัญหากับคำตอบที่ดีที่สุด (รวมถึงการปิดการใช้งานคีย์ต่างประเทศ) นี่คือทางออกอื่นจากฉัน :

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

ไม่ได้มี 1 ข้อความค้นหา แต่ค่อนข้างสั้นและหวาน:

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

ใช้สคริปต์ต่อไปนี้เพื่อdropทั้งหมด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

จากนั้นเรียกใช้สิ่งต่อไปนี้เพื่อวางตารางทั้งหมด:

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

สิ่งนี้ใช้ได้กับฉันใน Azure SQL Database ซึ่ง'sp_msforeachtable'ไม่สามารถใช้ได้!


1

ฉันรู้ว่าคำถามนี้เก่ามาก แต่ทุกครั้งที่ฉันต้องการรหัสนี้ .. โดยวิธีถ้าคุณมีตารางและมุมมองและฟังก์ชั่นและขั้นตอนคุณสามารถลบมันทั้งหมดโดยสคริปต์นี้ .. ดังนั้นทำไมฉันโพสต์สคริปต์นี้? เพราะถ้าคุณลบตารางทั้งหมดคุณจะต้องลบมุมมองทั้งหมดและถ้าคุณมีฟังก์ชั่นและขั้นตอนคุณต้องลบมันเกินไป
ฉันหวังว่ามันจะช่วยให้ใครบางคน

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.