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

时间: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