删除名称以某个字符串开头的所有表

Blo*_*ard 147 sql sql-server dynamic-sql

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

如果有人有脚本,或者可以快速敲门,请发布.

如果在我弄清楚之前没有人发布答案,我会发布我的解决方案.

Cur*_*her 146

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

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
Run Code Online (Sandbox Code Playgroud)

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

我知道如果我打算对生产数据库这样做,我会尽可能小心.

编辑代码示例已修复.

  • 在SQL Server 2005中,我不得不将最后两行更改为"close cmds"; deallocate cmds`. (7认同)
  • 由于主表和详细信息表之间存在外键约束,您可能需要多次运行此脚本. (5认同)

Xen*_*Yan 113

SELECT 'DROP TABLE "' + TABLE_NAME + '"' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '[prefix]%'
Run Code Online (Sandbox Code Playgroud)

这将生成一个脚本.

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

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

  • 将"prefix"替换为目标前缀时,我可能会添加删除括号. (10认同)
  • MYSQL:SELECT concat('DROP TABLE',TABLE_NAME,";")作为数据FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE'[prefix]%'---对于那些喜欢我的人发现这个帖子 (9认同)
  • 如果 _ 是前缀的一部分,请不要忘记转义,例如。`WHERE TABLE_NAME LIKE 'em\_%' ESCAPE '\';` (3认同)
  • 这会生成一个脚本,但是如何执行脚本呢? (3认同)

Ton*_*gan 16

这将以外键顺序获取表,并避免删除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
Run Code Online (Sandbox Code Playgroud)

  • 快速修复:TableName在WHERE子句中出现几次,应替换为OBJECT_NAME(so.object_id).好剧本! (3认同)

Ros*_*sim 6

在Oracle XE上,这有效:

SELECT 'DROP TABLE "' || TABLE_NAME || '";'
FROM USER_TABLES
WHERE TABLE_NAME LIKE 'YOURTABLEPREFIX%'
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要删除约束并释放空间,请使用以下命令:

SELECT 'DROP TABLE "' || TABLE_NAME || '" cascade constraints PURGE;'
FROM USER_TABLES
WHERE TABLE_NAME LIKE 'YOURTABLEPREFIX%'
Run Code Online (Sandbox Code Playgroud)

哪会产生一堆DROP TABLE cascade constraints PURGE陈述......

用于VIEWS此:

SELECT 'DROP VIEW "' || VIEW_NAME || '";'
FROM USER_VIEWS
WHERE VIEW_NAME LIKE 'YOURVIEWPREFIX%'
Run Code Online (Sandbox Code Playgroud)


Cad*_*oux 5

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
Run Code Online (Sandbox Code Playgroud)


tal*_*ony 5

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

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

这将为您提供一组以 wp_ 开头的所有表的删除查询


ven*_*dor 5

这是我的解决方案:

SELECT CONCAT('DROP TABLE `', TABLE_NAME,'`;') 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'TABLE_PREFIX_GOES_HERE%';
Run Code Online (Sandbox Code Playgroud)

当然,您需要替换TABLE_PREFIX_GOES_HERE为前缀。


mro*_*iak 5

EXEC sp_MSforeachtable 'if PARSENAME("?",1) like ''%CertainString%'' DROP TABLE ?'
Run Code Online (Sandbox Code Playgroud)

编辑:

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