Отбросьте все таблицы, имена которых начинаются с определенной строки

Как я могу удалить все таблицы, имена которых начинаются с данной строки?

Я думаю, что это можно сделать с помощью некоторого динамического SQL и таблиц INFORMATION_SCHEMA.

Ответ 1

Вам может потребоваться изменить запрос, чтобы включить владельца, если в базе данных больше одного.

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

Это проще, чем использование двухэтапного подхода генерации script плюс run. Но одним из преимуществ поколения script является то, что он дает вам возможность просмотреть всю полноту того, что будет запущено до его фактического запуска.

Я знаю, что если бы я собирался сделать это против производственной базы данных, я был бы предельно осторожен.

Изменить Исходный код кода исправлен.

Ответ 2

SELECT 'DROP TABLE "' + TABLE_NAME + '"' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '[prefix]%'

Это приведет к созданию script.

Добавление предложения для проверки наличия таблицы перед удалением:

SELECT 'IF OBJECT_ID(''' +TABLE_NAME + ''') IS NOT NULL BEGIN DROP TABLE [' + TABLE_NAME + '] END;' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '[prefix]%'

Ответ 3

Это даст вам таблицы в порядке внешнего ключа и не удаляет некоторые из таблиц, созданных 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

Ответ 4

В Oracle 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%'

Ответ 5

EXEC sp_MSforeachtable 'if PARSENAME("?",1) like ''%CertainString%'' DROP TABLE ?'

Edit:

Процедура sp_MSforeachtable не документирована, поэтому она не подходит для работы, поскольку ее поведение может варьироваться в зависимости от версии MS_SQL.

Ответ 6

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

Ответ 7

Я видел этот пост, когда искал оператор mysql, чтобы удалить все таблицы WordPress на основе @Xenph Yan, вот что я сделал в конце концов:

SELECT CONCAT(  'DROP TABLE `', TABLE_NAME,  '`;' ) AS query
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE  'wp_%'

это даст вам набор запросов на падение для всех таблиц, начиная с wp _

Ответ 8

Вот мое решение:

SELECT CONCAT('DROP TABLE `', TABLE_NAME,'`;') 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'TABLE_PREFIX_GOES_HERE%';

И, конечно же, вам нужно заменить TABLE_PREFIX_GOES_HERE на свой префикс.

Ответ 9

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 на символы, которые вы хотите выполнить.

Ответ 10

Спасибо Курту, что такое же решение, что я был на полпути через меня.

У вас лучше, чем у меня, хотя - он поддается легкой модификации. Я добавил объединение в select и уничтожил некоторые виды;)

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, пока я пытаюсь пробовать.

Ответ 11

select 'DROP TABLE ' + name from sysobjects
where type = 'U' and sysobjects.name like '%test%'

- Тест - это имя таблицы

Ответ 12

SELECT 'if object_id(''' + TABLE_NAME + ''') is not null begin drop table "' + TABLE_NAME + '" end;' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '[prefix]%'

Ответ 13

Мне пришлось сделать небольшой вывод на Xenph Yan, я подозреваю, потому что у меня были таблицы не в схеме по умолчанию.

SELECT 'DROP TABLE Databasename.schema.' + TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'strmatch%'

Ответ 14

В случае временных таблиц вы можете попробовать

SELECT 'DROP TABLE "' + t.name + '"' 
FROM tempdb.sys.tables t
WHERE t.name LIKE '[prefix]%'

Ответ 15

Это сработало для меня.

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += '
DROP TABLE ' 
    + QUOTENAME(s.name)
    + '.' + QUOTENAME(t.name) + ';'
    FROM sys.tables AS t
    INNER JOIN sys.schemas AS s
    ON t.[schema_id] = s.[schema_id] 
    WHERE t.name LIKE 'something%';

PRINT @sql;
-- EXEC sp_executesql @sql;