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


150

Як я можу скинути всі таблиці, імена яких починаються із заданого рядка?

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

Відповіді:


151

Можливо, вам доведеться змінити запит, щоб включити власника, якщо в базі даних є більше.

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

Це чистіше, ніж використання двоступеневого підходу створення сценарію плюс запуск. Але однією з переваг генерації сценаріїв є те, що він дає вам можливість переглянути всю сутність того, що буде запущено, перш ніж його реально запустити.

Я знаю, що якби я збирався це зробити проти виробничої бази, я би був максимально обережним.

Редагувати зразок коду виправлено.


5
Можливо, вам доведеться запустити цей сценарій кілька разів через обмеження зовнішніх ключів між таблицею майстра та деталей.
Олександр Прокоф’єв

7
У SQL Server 2005 мені довелося змінити останні два рядки на close cmds; deallocate cmds.
Хаміш Грубіян

Попередження : Це рішення може також видалити таблиці, створені SQL Server! Моє рішення, яке нижче, уникає цього і видаляє таблиці в порядку залежності від зовнішнього ключа.
Тоні О'Хаган

Це для мене не вийшло. Відповідь на це питання працював: stackoverflow.com/questions/5116296 / ...
Ayushmati

115
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]%'

10
Я можу додати, щоб зняти дужки, замінивши "префікс" вашим цільовим префіксом.
Левитикон

10
MYSQL: SELECT concat ('DROP TABLE', TABLE_NAME, ";") як дані ІНФОРМАЦІЙ_SCHEMA.TABLES WHERE TABLE_NAME LIKE '[prefix]%' --- для тих, хто, як я, знайшов цю тему
Andre

1
Результат також містить перегляди
Ondra

1
Не забудьте втекти _, якщо це частина вашого префікса, наприклад. WHERE TABLE_NAME LIKE 'em\_%' ESCAPE '\';
EM0

3
Це створює сценарій, але як виконати сценарій?
daOnlyBG

16

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


3
Швидке виправлення: TableName кілька разів відображається в пунктах WHERE і його слід замінити OBJECT_NAME (so.object_id). Гарний сценарій!
witttness

6

У 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%'

Працювали чудово. Видалити порожні таблиці з 61 КБ, які використовуються для забезпечення якості, мав 61 037 порожніх таблиць. Я використав приклад обмежень каскаду. Згенерований результат потім скопіював це все в сценарій і запустив його. Взяв назавжди, але це спрацювало як шарм! Дякую!
tehbeardedone

5

Я бачив цю публікацію, коли шукав операцію mysql, щоб скинути всі таблиці WordPress на основі @Xenph Yan ось що я зробив у підсумку:

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

це дасть вам набір запитів на падіння для всіх таблиць, починаючи з wp_


5

Ось моє рішення:

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

І звичайно вам потрібно замінити TABLE_PREFIX_GOES_HEREсвій префікс.


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

Редагувати:

sp_MSforeachtable є недокументованим, тому не підходить для виробництва, оскільки його поведінка може змінюватися залежно від версії MS_SQL.


Дивовижний однолінійний! Це слід проголосувати до верху.
користувач3413723

4
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

2

Відповідь Ксенфа Яна була набагато чистішою, ніж моя, але тут все одно і моя.

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до символів, з якими ви хочете шукати.


1

Це працювало для мене.

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;

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

- Тест - це назва таблиці


це насправді нічого не виконує, просто поверніть купу команд.
Стелс-рабин

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

0

Мені довелося зробити невелику деривацію відповіді Ксенфа Яна, яку я підозрюю, оскільки у мене були таблиці, які не є за замовчуванням.

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

0

У випадку тимчасових таблиць, ви можете спробувати

SELECT 'DROP TABLE "' + t.name + '"' 
FROM tempdb.sys.tables t
WHERE t.name LIKE '[prefix]%'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.