ChatGPT解决这个技术问题 Extra ChatGPT

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

如何删除名称以给定字符串开头的所有表?

我认为这可以通过一些动态 SQL 和 INFORMATION_SCHEMA 表来完成。


F
Filip Cornelissen

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

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

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

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

编辑代码示例已修复。


由于主表和详细表之间的外键约束,您可能必须多次运行此脚本。
在 SQL Server 2005 中,我必须将最后两行更改为 close cmds; deallocate cmds
警告:此解决方案还可能会删除 SQL Server 创建的表!我下面的解决方案避免了这种情况,并按外键依赖顺序删除了表。
这对我不起作用。这个问题的答案有效:stackoverflow.com/questions/5116296/…
C
CleanBold
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]%'

在用您的目标前缀替换“前缀”时,我可能会添加删除括号。
MYSQL: SELECT concat('DROP TABLE ',TABLE_NAME,";") as data FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '[prefix]%' --- 对于那些喜欢我的人发现了这个线程
结果还包含视图
如果那是前缀的一部分,请不要忘记转义 _,例如。 WHERE TABLE_NAME LIKE 'em\_%' ESCAPE '\';
这会生成一个脚本,但是如何执行该脚本呢?
N
Nhan

这将使您按外键顺序获取表,并避免删除一些由 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

快速修复:TableName 在 WHERE 子句中出现几次,应替换为 OBJECT_NAME(so.object_id)。不错的剧本!
N
Nhan

在 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%'

工作完美。有 61,037 个空表要从用于 QA 的数据库中删除。我使用了级联约束示例。生成输出,然后将其全部复制到脚本中并运行它。花了很长时间,但它就像一个魅力!谢谢!
m
mrosiak
EXEC sp_MSforeachtable 'if PARSENAME("?",1) like ''%CertainString%'' DROP TABLE ?'

编辑:

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


厉害了单机!这应该被投票给顶部。
D
Dakkaron

这是我的解决方案:

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

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


t
talsibony

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

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

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


L
Leon Bambrick
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

C
Community

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 更改为您要搜索的字符。


A
ASH

这对我有用。

DECLARE @sql NVARCHAR(MAX) = N'';

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.name LIKE 'something%';

PRINT @sql;
-- EXEC sp_executesql @sql;

g
gustavohenke
select 'DROP TABLE ' + name from sysobjects
where type = 'U' and sysobjects.name like '%test%'

-- test 是表名


这实际上并没有执行任何操作,只是返回一堆命令。
R
RGH
SELECT 'if object_id(''' + TABLE_NAME + ''') is not null begin drop table "' + TABLE_NAME + '" end;' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '[prefix]%'

X
Xaxum

我不得不对 Xenph Yan 的回答做一点推导,我怀疑是因为我的表不在默认模式中。

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

J
João Mergulhão

如果是临时表,您可能想尝试

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

T
Tomasz Wieczorkowski

我想发布我的解决方案建议,该解决方案基于通配符(例如“table_20210114”)删除(不仅仅是生成和选择删除命令)超过特定天数的所有表。

DECLARE 
    @drop_command NVARCHAR(MAX) = '',
    @system_time date,
    @table_date nvarchar(8),
    @older_than int = 7
    
Set @system_time = (select getdate() - @older_than)
Set @table_date = (SELECT CONVERT(char(8), @system_time, 112))

SELECT @drop_command += N'DROP TABLE ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME([Name]) + ';'
FROM <your_database_name>.sys.tables
WHERE [Name] LIKE 'table_%' AND RIGHT([Name],8) < @table_date

SELECT @drop_command
 
EXEC sp_executesql @drop_command

A
Arthur Cam

如果您的查询返回多行,您可以收集结果并将它们合并到一个查询中。

declare @Tables as nvarchar(max) = '[schemaName].['
select @Tables =@Tables + TABLE_NAME +'],[schemaName].['
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE='BASE TABLE'
AND TABLE_SCHEMA = 'schemaName'
AND TABLE_NAME like '%whateverYourQueryIs%'

select @Tables =  Left(@Tables,LEN(@Tables)-13) --trying to remove last ",[schemaName].[" part, so you need to change this 13 with actual lenght 

--print @Tables

declare @Query as nvarchar(max) = 'Drop table ' +@Tables 

--print @Query


exec sp_executeSQL @Query