删除名称以特定字符串开头的所有表格
我想要一个脚本删除名称以给定字符串开头的所有表格。我确信这可以通过一些动态sql和INFORMATION_SCHEMA
表来完成。删除名称以特定字符串开头的所有表格
如果有人有脚本,或者可以快速敲一下,请发布。
如果在我自己解决问题之前没有人发布答案,我会发布我的解决方案。
如果数据库中存在多个,您可能需要修改查询以包含所有者。
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
这比使用两步法生成脚本加运行更清洁。但脚本生成的一个优点是,它使您有机会在实际运行之前查看将要运行的全部内容。
我知道,如果我要对生产数据库进行此操作,我会尽可能小心。
编辑修正了代码示例。
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]%'
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
更改为您想要搜索的字符即可。
谢谢柯特,那就是我自己中途遇到的那种解决方案。
你的比我的更好 - 它适合于简单的修改。我加入了工会的选择,并消灭了一些看法,以及;)
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
别担心,这不是一个生产数据库 - 这仅仅是我开发的易于清理分贝,而我尝试的东西出。
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
select 'DROP TABLE ' + name from sysobjects
where type = 'U' and sysobjects.name like '%test%'
- 测试是表名
这将让你在国外键顺序表和避免摔落一些由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
SELECT 'if object_id(''' + TABLE_NAME + ''') is not null begin drop table "' + TABLE_NAME + '" end;'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE '[prefix]%'
我不得不做Xenph燕的回答略有推导我怀疑,因为我没有在默认模式中的表。
SELECT 'DROP TABLE Databasename.schema.' + TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'strmatch%'
在甲骨文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%'
我看到的时候我一直在寻找MySQL的语句删除基于@Xenph颜这里所有的WordPress表这篇文章是我做的最后:
SELECT CONCAT( 'DROP TABLE `', TABLE_NAME, '`;') AS query
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'wp_%'
这将给你设定下降查询的所有表与WP_
这里开始是我的解决方案:
SELECT CONCAT('DROP TABLE `', TABLE_NAME,'`;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'TABLE_PREFIX_GOES_HERE%';
当然,您需要用您的前缀替换TABLE_PREFIX_GOES_HERE
。
EXEC sp_MSforeachtable 'if PARSENAME("?",1) like ''%CertainString%'' DROP TABLE ?'
编辑:
sp_MSforeachtable是无证因此不适合用于生产,因为它的行为可能会因MS_SQL版本而异。
在临时表的情况下,你可能会想尝试
SELECT 'DROP TABLE "' + t.name + '"'
FROM tempdb.sys.tables t
WHERE t.name LIKE '[prefix]%'
我可以补充你的目标前缀取代“前缀”时卸下支架。 – Levitikon 2012-05-20 15:31:54
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
结果还包含视图 – Ondra 2013-03-29 13:01:44