删除名称以特定字符串开头的所有表

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

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

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

0

14 答案

Xenph Yan's answer was far cleaner than mine but here is mine all the same.

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
额外
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]%'
0
额外
将目标前缀替换为“前缀”时,我可能会添加以删除括号。
额外 作者 Levitikon,
真棒!我真的很欣赏脚本的第一种方法,所以我可以看到会发生什么,而不仅仅是执行。超级有用的感谢!
额外 作者 hardba11,
MYSQL:SELECT concat('DROP TABLE',TABLE_NAME,“;”)as data FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE'[prefix]%'---对于那些喜欢我的人来说,发现了这个线程
额外 作者 Andre,
结果还包含意见
额外 作者 Ondra,
如果这是你的前缀的一部分,不要忘记逃跑_例如。 WHERE TABLE_NAME LIKE'em \ _%'ESCAPE'\';
额外 作者 EM0,
这会生成一个脚本,但是如何执行脚本?
额外 作者 daOnlyBG,

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

你的比我的更好 - 它适合于简单的修改。我在选择中加入了一个联盟,并删除了一些意见;)

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

别担心,它不是一个生产数据库 - 这只是为了方便清理我的开发数据库,​​而我尝试了一些东西。

0
额外
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
额外

我不得不对Xenph Yan的答案做一个小小的推导,因为我的表格不在默认模式中。

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

当我在寻找mysql语句来删除基于@Xenph Yan的所有WordPress表格时,我看到了这篇文章。这是我最终做的:

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

这会给你所有表的丢弃查询集,以wp_开头

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

修改</强>

sp_MSforeachtable没有记录,因此不适合生产,因为它的行为可能因MS_SQL版本而异。

0
额外
真棒单线!这应该被选为最高级。
额外 作者 user3413723,

在Oracle 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%'
0
额外

这将以外键顺序为您提供表格,并避免删除由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
额外
快速修复:TableName在WHERE子句中出现几次,应该替换为OBJECT_NAME(so.object_id)。好脚本!
额外 作者 witttness,
额外 作者 Tony O'Hagan,

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

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

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

我知道,如果我要对生产数据库做这件事,我会尽可能小心。

Edit Code sample fixed.

0
额外
由于主表和详细表之间的外键约束,您可能必须多次运行此脚本。
额外 作者 Alexander Prokofyev,
在SQL Server 2005中,我必须将最后两行更改为 close cmds;解除分配cmds
额外 作者 Hamish Grubijan,
警告:此解决方案也可能删除由SQL Server创建的表!我的解决方案避免了这一点,并删除外键依赖顺序的表。
额外 作者 Tony O'Hagan,
select 'DROP TABLE ' + name from sysobjects
where type = 'U' and sysobjects.name like '%test%'

- 测试是表名

0
额外
这实际上并不执行任何操作,只是返回一堆命令。
额外 作者 Stealth Rabbi,
关于FK呢?
额外 作者 user3104183,
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
额外

这是我的解决方案:

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

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

0
额外

在临时表的情况下,您可能需要尝试

SELECT 'DROP TABLE "' + t.name + '"' 
FROM tempdb.sys.tables t
WHERE t.name LIKE '[prefix]%'
0
额外