Frage

Ich möchte ein Skript löschen Sie alle Tabellen, deren name beginnt mit einem gegebenen string.Ich bin sicher, dass dies getan werden kann, mit einigen dynamischen sql und der INFORMATION_SCHEMA Tabellen.

Wenn jemand ein script oder kann knock one up schnell, bitte posten Sie es.

Wenn niemand Bucht eine Antwort, bevor ich es herausfinden, ich selbst, ich poste meine Lösung.

War es hilfreich?

Lösung

Möglicherweise müssen Sie die Abfrage ändern, um den Eigentümer, wenn es mehr als einen in der Datenbank.

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

Dies ist sauberer als die Verwendung eines zwei-Schritt-Ansatz, der ein Skript generieren, plus ausführen.Aber ein Vorteil des scripts ist, dass es Ihnen die Möglichkeit gibt, zu überprüfen Sie die Gesamtheit, was Los ist, ausgeführt zu werden, bevor es tatsächlich ausgeführt wird.

Ich weiß, dass wenn ich im Begriff waren zu tun, diese gegen eine Produktionsdatenbank, würde ich so vorsichtig wie möglich.

Bearbeiten Codebeispiel behoben.

Andere Tipps

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

Dies wird ein Skript generieren.

Hinzufügen-Klausel zu überprüfen, die Existenz der Tabelle vor dem löschen:

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

Diese erhalten Sie die Tabellen in fremden Schlüssel um und vermeiden Sie, fallen einige der Tabellen von SQL Server erstellt.Die t.Ordinal Wert wird schneiden Sie die Tische in Abhängigkeit Schichten.

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

Auf Oracle XE das funktioniert:

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

Oder wenn Sie möchten entfernen Sie die Einschränkungen und Speicherplatz wie gut, verwenden Sie diese:

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

Die erzeugen Sie eine Reihe von DROP TABLE cascade constraints PURGE Anweisungen...

Für VIEWS benutzen Sie diese:

SELECT 'DROP VIEW "' || VIEW_NAME || '";'
FROM USER_VIEWS
WHERE VIEW_NAME LIKE 'YOURVIEWPREFIX%'
EXEC sp_MSforeachtable 'if PARSENAME("?",1) like ''%CertainString%'' DROP TABLE ?'

Edit:

sp_MSforeachtable ist nicht dokumentiert, daher nicht geeignet für die Produktion, weil es das Verhalten kann je nach MS_SQL version.

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

Ich sah diesen Beitrag, wenn ich war auf der Suche für die mysql-Anweisung zum löschen aller WordPress-Tabellen basierend auf dem @Xenph Yan-hier ist das, was ich schließlich:

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

dies wird Ihnen die Menge der Tropfen, die Abfragen für alle Tabellen beginnt mit wp_

Hier ist meine Lösung:

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

Und natürlich müssen Sie ersetzen TABLE_PREFIX_GOES_HERE mit Ihr Präfix.

Xenph Yan's Antwort war viel sauberer als meine, aber hier ist mir alles gleich.

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

Ändern Sie einfach tableName zu den Zeichen, die Sie suchen möchten, mit.

Dank Curt, das ist die gleiche Art von Lösung, die ich war auf halbem Weg durch mich.

Deiner ist schöner als meine, obwohl es eignet sich für einfache änderung.Ich habe eine union, um die wählen Sie und wischte sich einige Ansichten, wie gut ;)

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

Mach dir keine sorgen, es ist nicht eine Produktions-Datenbank - dies ist nur für leicht sauber-up von meinem dev-db, während ich versuche, Sachen heraus.

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

-- Test-ist der name der Tabelle

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

Ich musste eine leichte Ableitung auf Xenph Yan Antwort ich vermute, da hatte ich die Tabellen nicht in der Standard-schema.

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

In Fall von temporäre Tabellen, möchten Sie vielleicht, um zu versuchen

SELECT 'DROP TABLE "' + t.name + '"' 
FROM tempdb.sys.tables t
WHERE t.name LIKE '[prefix]%'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top