Как я могу удалить несколько таблиц (но не все) в одной базе данных? - PullRequest
0 голосов
/ 04 ноября 2018

Мой случай: DBname: группы и временные таблицы, создаваемые серийным номером каждый раз, когда внутренний пользователь создает новую группу элементов глоссария (т. Е. 1000, 10001, 10002 ...). Как я могу удалить таблицы, которые имеют серийный номер> 10002?

Мне нужно удалить таблицы, используя условие, где имя таблицы> 1002.

1 Ответ

0 голосов
/ 04 ноября 2018

В Sql Server самым простым способом, вероятно, будет генерирование динамического sql с использованием information_schema.tables:

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_1000, glossary_items_1001 и т. д.)

После комментария Дэна Гузмана - лучшая реализация будет использовать 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;
...