Aruncați toate tabelele ale căror nume încep cu un anumit șir

Aș dori ca un script să renunțe la toate tabelele ale căror nume încep cu un șir dat. Sunt sigur că acest lucru se poate face cu niște tabele dinamice SQL și cu tabelele INFORMATION_SCHEMA .

Dacă cineva are un scenariu sau poate să-l bată repede, vă rugăm să îl postați.

Dacă nimeni nu va răspunde înainte de a-mi da seama, voi posta soluția mea.

0
fr hi bn

14 răspunsuri

Xenph Yan's answer was far cleaner than mine but here is mine all the same.

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

Doar modificați tableName la caracterele cu care doriți să căutați.

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

Aceasta va genera un script.

Adăugarea clauzei pentru a verifica existența tabelului înainte de a șterge:

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
adăugat
S-ar putea adăuga pentru a elimina parantezele atunci când înlocuiți "prefixul" cu prefixul țintă.
adăugat autor Levitikon, sursa
Minunat! Apreciez cu adevarat scriptul prima abordare, asa ca am putut vedea ce a fost de gând să scadă, spre deosebire de executarea doar. Super ajutor mulțumesc!
adăugat autor hardba11, sursa
MYSQL: SELECT concat ("DROP TABLE", TABLE_NAME, ";") ca date FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '[prefix]%' --- pentru cei care mi-au placut acest thread
adăugat autor Andre, sursa
Rezultatul conține și vederi
adăugat autor Ondra, sursa
Nu uitați să scăpați - dacă face parte din prefixul dvs., de ex. WHERE TABLE_NAME LIKE 'em \ _%' ESCAPE '\';
adăugat autor EM0, sursa
Acest lucru generează un script, dar cum se execută scenariul?
adăugat autor daOnlyBG, sursa

Mulțumesc lui Curt, este același tip de soluție pe care am fost la jumătatea drumului prin mine.

A ta este mai frumoasă decât a mea - se impune modificării ușoare. Am adăugat o uniune selecției și am șters câteva vederi;)

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

Nu vă faceți griji, nu este o bază de date de producție - acest lucru este doar pentru a curăța ușor de dev db mea în timp ce încerc chestii afară.

0
adăugat
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
0
adăugat

A trebuit să fac o derivare ușoară pe răspunsul lui Xenph Yan, bănuiesc că am avut tabele care nu erau în schema implicită.

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

Am văzut acest post atunci când am fost în căutarea declarației MySQL pentru a renunța la toate tabelele WordPress bazate pe @ Xenph Yan aici este ceea ce am făcut în cele din urmă:

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

acest lucru vă va oferi setul de interogări pentru toate tabelele care încep cu wp_

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

Editare:

sp_MSforeachtable este nedocumentat, prin urmare nu este potrivit pentru producție, deoarece comportamentul acestuia poate varia în funcție de versiunea MS_SQL.

0
adăugat
Awesome one-liner! Aceasta ar trebui votată în partea de sus.
adăugat autor user3413723, sursa

Pe Oracle XE funcționează:

SELECT 'DROP TABLE "' || TABLE_NAME || '";'
FROM USER_TABLES
WHERE TABLE_NAME LIKE 'YOURTABLEPREFIX%'

Sau dacă doriți să eliminați constrângerile și să eliberați spațiu , utilizați acest lucru:

SELECT 'DROP TABLE "' || TABLE_NAME || '" cascade constraints PURGE;'
FROM USER_TABLES
WHERE TABLE_NAME LIKE 'YOURTABLEPREFIX%'

Care va genera o mulțime de instrucțiuni DROP TABLE cascadă constrângeri PURGE ...

Pentru VIEWS utilizați această opțiune:

SELECT 'DROP VIEW "' || VIEW_NAME || '";'
FROM USER_VIEWS
WHERE VIEW_NAME LIKE 'YOURVIEWPREFIX%'
0
adăugat

Acest lucru vă va aduce tabelele în ordine de chei străine și evitați să abandonați unele dintre tabelele create de SQL Server. Valoarea t.Ordinal va aluneca tabelele în straturi de dependență.

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
0
adăugat
Fixare rapidă: TableName apare de câteva ori în clauzele WHERE și ar trebui înlocuit cu OBJECT_NAME (so.object_id). Scriptură frumoasă!
adăugat autor witttness, sursa
adăugat autor Tony O'Hagan, sursa

Este posibil să fie necesar să modificați interogarea pentru a include proprietarul dacă există mai multe în baza de date.

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

Acest lucru este mai curat decât folosind o abordare în două etape de generare de script-uri plus rulați. Dar un avantaj al generației de scenarii este că vă oferă șansa să revizuiți întregul ce urmează să fie rulat înainte de a fi rulat.

Știu că dacă aș face asta împotriva unei baze de date de producție, aș fi cât mai atent posibil.

Edit Code sample fixed.

0
adăugat
Este posibil să trebuiască să executați acest script de mai multe ori din cauza constrângerilor cheie străine între tabelele principale și cele detaliate.
adăugat autor Alexander Prokofyev, sursa
În SQL Server 2005 a trebuit să schimb ultimele două linii în close cmds; cedare cmds .
adăugat autor Hamish Grubijan, sursa
Avertisment : Această soluție poate șterge, de asemenea, tabelele create de SQL Server! Soluția mea de mai jos evită acest lucru și șterge tabelele în ordinea dependenței de chei străine.
adăugat autor Tony O'Hagan, sursa
select 'DROP TABLE ' + name from sysobjects
where type = 'U' and sysobjects.name like '%test%'

- Testul este numele tabelului

0
adăugat
acest lucru nu execută nimic, întoarce doar o grămadă de comenzi.
adăugat autor Stealth Rabbi, sursa
Cum rămâne cu FK-urile?
adăugat autor user3104183, sursa
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
adăugat

Iată soluția mea:

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

Și, desigur, trebuie să înlocuiți TABLE_PREFIX_GOES_HERE cu prefixul dvs.

0
adăugat

În cazul tabelelor temporare, poate doriți să încercați

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