如何在一个数据库中删除多个表(但不是全部)?

时间:2018-11-04 13:43:14

标签: database sql-server-2012

我的情况是:DBname:后端用户每次创建一组新的词汇表项目(即1000、10001、10002 ...)时,由序列号创建的组和临时表。如何删除具有序列号> 10002?

我需要使用表名称> 1002的条件删除表。

1 个答案:

答案 0 :(得分:1)

在Sql Server中,最简单的方法可能是使用information_schema.tables生成动态sql:

DECLARE @Sql nvarchar(4000) = ''; -- you might need max instead of 4000 here...

 SELECT @Sql = @Sql + 'DROP TABLE '+ TABLE_NAME +';'
 FROM information_schema.tables
 WHERE TABLE_NAME LIKE 'glossary_items%'
 AND CAST(REPLACE(TABLE_NAME, 'glossary_items_', '') As int) > 1002;

EXEC(@Sql)

假设表名是glossary_items_XXXX,其中XXXX是数字 (因此glossary_items_1000glossary_items_1001等)

在丹·古兹曼(Dan Guzman)评论之后-更好的实现方式是将for xml用于2016版(或更早版本):

SET @Sql = (
    SELECT 'DROP TABLE '+ TABLE_NAME +';'
    FROM information_schema.tables
    WHERE TABLE_NAME LIKE 'glossary_items%'
    AND CAST(REPLACE(TABLE_NAME, 'glossary_items_', '') As int) > 1002;
    FOR XML PATH('')
)

string_agg(对于2017版(或更高版本):

SELECT @Sql = STRING_AGG('DROP TABLE '+ TABLE_NAME, ';')
FROM information_schema.tables
WHERE TABLE_NAME LIKE 'glossary_items%'
AND CAST(REPLACE(TABLE_NAME, 'glossary_items_', '') As int) > 1002;