2008-08-07 95 views
116

我想要一个脚本删除名称以给定字符串开头的所有表格。我确信这可以通过一些动态sql和INFORMATION_SCHEMA表来完成。删除名称以特定字符串开头的所有表格

如果有人有脚本,或者可以快速敲一下,请发布。

如果在我自己解决问题之前没有人发布答案,我会发布我的解决方案。

回答

120

如果数据库中存在多个,您可能需要修改查询以包含所有者。

DECLARE @cmd varchar(4000) 
DECLARE cmds CURSOR FOR 
SELECT 'drop table [' + Table_Name + ']' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE Table_Name LIKE 'prefix%' 

OPEN cmds 
WHILE 1 = 1 
BEGIN 
    FETCH cmds INTO @cmd 
    IF @@fetch_status != 0 BREAK 
    EXEC(@cmd) 
END 
CLOSE cmds; 
DEALLOCATE cmds 

这比使用两步法生成脚本加运行更清洁。但脚本生成的一个优点是,它使您有机会在实际运行之前查看将要运行的全部内容。

我知道,如果我要对生产数据库进行此操作,我会尽可能小心。

编辑修正了代码示例。

95
SELECT 'DROP TABLE "' + TABLE_NAME + '"' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '[prefix]%' 

这将生成一个脚本。

添加子句删除前检查表的存在:

SELECT 'IF OBJECT_ID(''' +TABLE_NAME + ''') IS NOT NULL BEGIN DROP TABLE [' + TABLE_NAME + '] END;' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '[prefix]%' 
+9

我可以补充你的目标前缀取代“前缀”时卸下支架。 – Levitikon 2012-05-20 15:31:54

+6

MYSQL:SELECT concat('DROP TABLE',TABLE_NAME,“;”)as data FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE'[prefix]%'---对于那些喜欢我的人发现此线程 – Andre 2012-11-06 00:27:01

+1

结果还包含视图 – Ondra 2013-03-29 13:01:44

3

Xenph Yan的回答是远远比我更清洁,但这里是我的都是一样的。

DECLARE @startStr AS Varchar (20) 
SET @startStr = 'tableName' 

DECLARE @startStrLen AS int 
SELECT @startStrLen = LEN(@startStr) 

SELECT 'DROP TABLE ' + name FROM sysobjects 
WHERE type = 'U' AND LEFT(name, @startStrLen) = @startStr 

只需将tableName更改为您想要搜索的字符即可。

0

谢谢柯特,那就是我自己中途遇到的那种解决方案。

你的比我的更好 - 它适合于简单的修改。我加入了工会的选择,并消灭了一些看法,以及;)

declare @cmd varchar(4000) 
declare cmds cursor for 
Select 'drop table [' + Table_Name + ']' 
From INFORMATION_SCHEMA.TABLES 
Where Table_Name like 'prefix%' 
union 
Select 'drop view [' + Table_Name + ']' 
From INFORMATION_SCHEMA.VIEWS 
Where Table_Name like 'prefix%' 
open cmds 
while 1=1 
begin 
    fetch cmds into @cmd 
    if @@fetch_status != 0 break 
    exec(@cmd) 
end 
close local 
deallocate local 

别担心,这不是一个生产数据库 - 这仅仅是我开发的易于清理分贝,而我尝试的东西出。

4
CREATE PROCEDURE usp_GenerateDROP 
    @Pattern AS varchar(255) 
    ,@PrintQuery AS bit 
    ,@ExecQuery AS bit 
AS 
BEGIN 
    DECLARE @sql AS varchar(max) 

    SELECT @sql = COALESCE(@sql, '') + 'DROP TABLE [' + TABLE_NAME + ']' + CHAR(13) + CHAR(10) 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_NAME LIKE @Pattern 

    IF @PrintQuery = 1 PRINT @sql 
    IF @ExecQuery = 1 EXEC (@sql) 
END 
0
select 'DROP TABLE ' + name from sysobjects 
where type = 'U' and sysobjects.name like '%test%' 

- 测试是表名

14

这将让你在国外键顺序表和避免摔落一些由SQL Server创建的表。 t.Ordinal值将把表分成依赖层。

WITH TablesCTE(SchemaName, TableName, TableID, Ordinal) AS 
(
    SELECT OBJECT_SCHEMA_NAME(so.object_id) AS SchemaName, 
     OBJECT_NAME(so.object_id) AS TableName, 
     so.object_id AS TableID, 
     0 AS Ordinal 
    FROM sys.objects AS so 
    WHERE so.type = 'U' 
     AND so.is_ms_Shipped = 0 
     AND OBJECT_NAME(so.object_id) 
     LIKE 'MyPrefix%' 

    UNION ALL 
    SELECT OBJECT_SCHEMA_NAME(so.object_id) AS SchemaName, 
     OBJECT_NAME(so.object_id) AS TableName, 
     so.object_id AS TableID, 
     tt.Ordinal + 1 AS Ordinal 
    FROM sys.objects AS so 
     INNER JOIN sys.foreign_keys AS f 
      ON f.parent_object_id = so.object_id 
       AND f.parent_object_id != f.referenced_object_id 
     INNER JOIN TablesCTE AS tt 
      ON f.referenced_object_id = tt.TableID 
    WHERE so.type = 'U' 
     AND so.is_ms_Shipped = 0 
     AND OBJECT_NAME(so.object_id) 
     LIKE 'MyPrefix%' 
) 
SELECT DISTINCT t.Ordinal, t.SchemaName, t.TableName, t.TableID 
FROM TablesCTE AS t 
    INNER JOIN 
    (
     SELECT 
      itt.SchemaName AS SchemaName, 
      itt.TableName AS TableName, 
      itt.TableID AS TableID, 
      Max(itt.Ordinal) AS Ordinal 
     FROM TablesCTE AS itt 
     GROUP BY itt.SchemaName, itt.TableName, itt.TableID 
    ) AS tt 
     ON t.TableID = tt.TableID 
      AND t.Ordinal = tt.Ordinal 
ORDER BY t.Ordinal DESC, t.TableName ASC 
0
SELECT 'if object_id(''' + TABLE_NAME + ''') is not null begin drop table "' + TABLE_NAME + '" end;' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '[prefix]%' 
0

我不得不做Xenph燕的回答略有推导我怀疑,因为我没有在默认模式中的表。

SELECT 'DROP TABLE Databasename.schema.' + TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'strmatch%' 
4

在甲骨文XE这工作:

SELECT 'DROP TABLE "' || TABLE_NAME || '";' 
FROM USER_TABLES 
WHERE TABLE_NAME LIKE 'YOURTABLEPREFIX%' 

或者,如果你想删除约束和释放空间为好,使用此:

SELECT 'DROP TABLE "' || TABLE_NAME || '" cascade constraints PURGE;' 
FROM USER_TABLES 
WHERE TABLE_NAME LIKE 'YOURTABLEPREFIX%' 

将产生一堆DROP TABLE cascade constraints PURGE报表...

对于VIEWS使用本:

SELECT 'DROP VIEW "' || VIEW_NAME || '";' 
FROM USER_VIEWS 
WHERE VIEW_NAME LIKE 'YOURVIEWPREFIX%' 
4

我看到的时候我一直在寻找MySQL的语句删除基于@Xenph颜这里所有的WordPress表这篇文章是我做的最后:

SELECT CONCAT( 'DROP TABLE `', TABLE_NAME, '`;') AS query 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'wp_%' 

这将给你设定下降查询的所有表与WP_

2

这里开始是我的解决方案:

SELECT CONCAT('DROP TABLE `', TABLE_NAME,'`;') 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'TABLE_PREFIX_GOES_HERE%'; 

当然,您需要用您的前缀替换TABLE_PREFIX_GOES_HERE

4
EXEC sp_MSforeachtable 'if PARSENAME("?",1) like ''%CertainString%'' DROP TABLE ?' 

编辑:

sp_MSforeachtable是无证因此不适合用于生产,因为它的行为可能会因MS_SQL版本而异。

0

在临时表的情况下,你可能会想尝试

SELECT 'DROP TABLE "' + t.name + '"' 
FROM tempdb.sys.tables t 
WHERE t.name LIKE '[prefix]%' 
相关问题