Сведения о вопросе

Holish

16:03, 1st July, 2020

Теги

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

Просмотров: 501   Ответов: 14

Я бы хотел, чтобы скрипт отбросил все таблицы, имя которых начинается с заданной строки. Я уверен, что это можно сделать с некоторыми динамическими таблицами sql и INFORMATION_SCHEMA .

Если у кого-то есть сценарий или он может быстро его создать, пожалуйста, опубликуйте его.

Если никто не отправит ответ до того, как я сам это выясню, я отправлю свое решение.



  Сведения об ответе

ASER

18:03, 1st July, 2020

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

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

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

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

Исправлен пример редактирования кода.


  Сведения об ответе

+-*/

18:03, 1st July, 2020

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


  Сведения об ответе

JUST___

18:03, 1st July, 2020

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


  Сведения об ответе

#hash

18:03, 1st July, 2020

На 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%'


  Сведения об ответе

appple

18:03, 1st July, 2020

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

Редактировать:

sp_MSforeachtable недокументирован, следовательно, не подходит для производства, потому что его поведение может варьироваться в зависимости от версии MS_SQL.


  Сведения об ответе

ASER

18:03, 1st July, 2020

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


  Сведения об ответе

fo_I_K

18:03, 1st July, 2020

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

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

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


  Сведения об ответе

SILA

18:03, 1st July, 2020

Ответ ксенфа Яна был намного чище моего, но здесь все равно мой.

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


  Сведения об ответе

prince

18:03, 1st July, 2020

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

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

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


  Сведения об ответе

ITSME

18:03, 1st July, 2020

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

Но ваш лучше моего - он легко поддается модификации. Я добавил Союза, чтобы выбрать и уничтожил некоторые виды, а также ;)

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, пока я пробую вещи.


  Сведения об ответе

VERSUION

18:03, 1st July, 2020

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

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


  Сведения об ответе

PAGE

18:03, 1st July, 2020

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


  Сведения об ответе

piter

18:03, 1st July, 2020

Я должен был сделать небольшой вывод на ответ Ксенфа Яна, я подозреваю, потому что у меня были таблицы не в схеме по умолчанию.

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


  Сведения об ответе

DO__IT

18:03, 1st July, 2020

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться