删除所有名称以特定字符串开头的表
时间:2020-03-05 18:38:15 来源:igfitidea点击:
我想要一个脚本来删除所有名称以给定字符串开头的表。我确信这可以通过一些动态sql和INFORMATION_SCHEMA表来完成。
如果有人有脚本,或者可以快速将其删除,请发布该脚本。
如果在我自己弄清楚答案之前没有人发布答案,我将发布解决方案。
解决方案
回答
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%' OPEN cmds WHILE 1 = 1 BEGIN FETCH cmds INTO @cmd IF @@fetch_status != 0 BREAK EXEC(@cmd) END CLOSE cmds; DEALLOCATE cmds
这比使用生成脚本加运行的两步方法要干净。但是脚本生成的一个优点是,它使我们有机会在实际运行之前检查所有要运行的内容。
我知道,如果要针对生产数据库执行此操作,请尽可能小心。
编辑代码示例已修复。
回答
谢谢Curt,这与我自己遇到的那种解决方案是一样的。
比我的要好,尽管它很容易修改。我在选择中添加了一个并集,并消除了一些意见;)
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
不用担心,它不是生产数据库,这只是为了在我尝试使用东西时轻松清理我的dev db。
回答
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