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

голоса
120

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

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

Если никто не отправляет ответ, прежде чем я понять это сам, я вывешу мое решение.

Задан 07/08/2008 в 05:41
источник пользователем
На других языках...                            


14 ответов

голоса
123

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

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

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

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

Изменить образец кода фиксирована.

Ответил 07/08/2008 в 05:53
источник пользователем

голоса
100
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]%'
Ответил 07/08/2008 в 05:44
источник пользователем

голоса
14

Это поможет вам таблицы в иностранном порядке ключа и не уронить некоторые из таблиц , созданных 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
Ответил 10/02/2014 в 09:04
источник пользователем

голоса
4
EXEC sp_MSforeachtable 'if PARSENAME("?",1) like ''%CertainString%'' DROP TABLE ?'

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

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

Ответил 08/06/2016 в 16:33
источник пользователем

голоса
4

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

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

это даст вам множество запросов капельных для всех таблиц начинается с wp_

Ответил 28/07/2015 в 06:14
источник пользователем

голоса
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%'
Ответил 21/05/2015 в 11:31
источник пользователем

голоса
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
Ответил 10/10/2008 в 03:31
источник пользователем

голоса
3

Xenph Ян ответ «s был намного чище , чем у меня , но вот мое все равно.

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

Ответил 07/08/2008 в 05:53
источник пользователем

голоса
2

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

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

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

Ответил 24/03/2016 в 12:19
источник пользователем

голоса
0

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

SELECT 'DROP TABLE "' + t.name + '"' 
FROM tempdb.sys.tables t
WHERE t.name LIKE '[prefix]%'
Ответил 06/09/2016 в 11:21
источник пользователем

голоса
0

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

SELECT 'DROP TABLE Databasename.schema.' + TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'strmatch%'
Ответил 16/02/2015 в 01:05
источник пользователем

голоса
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]%'
Ответил 01/08/2014 в 15:16
источник пользователем

голоса
0
select 'DROP TABLE ' + name from sysobjects
where type = 'U' and sysobjects.name like '%test%'

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

Ответил 24/06/2013 в 18:42
источник пользователем

голоса
0

Благодаря Curt, это же своего рода решение, что я был на полпути через себя.

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

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

Не волнуйтесь, это не производственная база данных - это только для легкой очистки моего разработчика БД в то время как я пытаюсь вещи из.

Ответил 07/08/2008 в 06:00
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more