ฉันไม่ต้องการพิมพ์ชื่อตารางทั้งหมดเพื่อลบทั้งหมด เป็นไปได้หรือไม่กับคำค้นหาเดียว?
ฉันไม่ต้องการพิมพ์ชื่อตารางทั้งหมดเพื่อลบทั้งหมด เป็นไปได้หรือไม่กับคำค้นหาเดียว?
คำตอบ:
ใช้มุมมอง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"
[sys]
มุมมอง schema หากไม่จำเป็นต้องพกพาข้าม rdbms ' stackoverflow.com/a/3654313/251174
Print @sql
exec
แล้วกำลังดำเนินการงบลดลงสร้างแบบไดนามิกผ่านsp_executesql
หากคุณต้องการใช้แบบสอบถาม SQL เพียงแบบสอบถามเดียวเพื่อลบตารางทั้งหมดคุณสามารถใช้สิ่งนี้:
EXEC sp_MSforeachtable @command1 = "DROP TABLE ?"
นี่เป็นขั้นตอนการจัดเก็บที่ซ่อนอยู่ในเซิร์ฟเวอร์ sql และจะถูกดำเนินการสำหรับแต่ละตารางในฐานข้อมูลที่คุณเชื่อมต่อ
หมายเหตุ:คุณอาจต้องดำเนินการแบบสอบถามสองสามครั้งเพื่อลบตารางทั้งหมดเนื่องจากการอ้างอิง
Note2:เพื่อหลีกเลี่ยงบันทึกย่อแรกก่อนเรียกใช้แบบสอบถามให้ตรวจสอบก่อนว่ามีคีย์ต่างประเทศสัมพันธ์กับตารางใด ๆ หรือไม่ หากมีอยู่แล้วให้ปิดการใช้งานข้อ จำกัด foreign key โดยการเรียกใช้คำสั่งร้อง:
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
หากคุณไม่ต้องการพิมพ์คุณสามารถสร้างคำสั่งด้วยสิ่งนี้:
USE Databasename
SELECT 'DROP TABLE [' + name + '];'
FROM sys.tables
จากนั้นคัดลอกและวางลงในหน้าต่าง SSMS ใหม่เพื่อเรียกใช้
QUOTENAME
ซึ่งดูเรียบร้อย 'DROP TABLE ' + QUOTENAME(name) + ';'
คุณสามารถใช้สคริปต์ต่อไปนี้เพื่อวางทุกอย่างรวมถึงต่อไปนี้:
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
ฉันเพียงแค่ทำการเปลี่ยนแปลงเล็กน้อยในคำตอบของ @ 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;
[sys]
มุมมองคีถ้าไม่จำเป็นต้องพกพาข้าม rdbms ' stackoverflow.com/a/3654313/251174
จากการติดตามของ Dave.Gugg คำตอบนี้จะเป็นรหัสที่ใครบางคนจะต้องได้รับ DROP Table ทุกบรรทัดใน MySQL:
SELECT CONCAT('DROP TABLE ', TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.tables
WHERE TABLE_SCHEMA = 'your_database_name'
วิธีที่ง่ายที่สุดคือการวางฐานข้อมูลทั้งหมดและสร้างอีกครั้ง:
drop database db_name
create database db_name
นั่นคือทั้งหมดที่
หากใครมีปัญหากับคำตอบที่ดีที่สุด (รวมถึงการปิดการใช้งานคีย์ต่างประเทศ) นี่คือทางออกอื่นจากฉัน :
-- 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'
ไม่ได้มี 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
ใช้สคริปต์ต่อไปนี้เพื่อ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'
ไม่สามารถใช้ได้!
ฉันรู้ว่าคำถามนี้เก่ามาก แต่ทุกครั้งที่ฉันต้องการรหัสนี้ .. โดยวิธีถ้าคุณมีตารางและมุมมองและฟังก์ชั่นและขั้นตอนคุณสามารถลบมันทั้งหมดโดยสคริปต์นี้ .. ดังนั้นทำไมฉันโพสต์สคริปต์นี้? เพราะถ้าคุณลบตารางทั้งหมดคุณจะต้องลบมุมมองทั้งหมดและถ้าคุณมีฟังก์ชั่นและขั้นตอนคุณต้องลบมันเกินไป
ฉันหวังว่ามันจะช่วยให้ใครบางคน
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