Löschen Sie alle Tabellen, deren Namen mit einer bestimmten Zeichenfolge beginnen

  • Ich möchte, dass ein Skript alle Tabellen löscht, deren Name mit einer angegebenen Zeichenfolge beginnt. Ich bin mir sicher, dass dies mit etwas dynamischem SQL und den INFORMATION_SCHEMA -Tabellen möglich ist.

    Wenn jemand ein Skript hat oder schnell ein Skript aufschlagen kann, dann poste es bitte.

    Wenn niemand eine Antwort veröffentlicht, bevor ich es selbst herausfinde, werde ich meine Lösung posten.

    08 January 2013
    Blorgbeard
13 answers
  • Möglicherweise müssen Sie die Abfrage ändern, um den Eigentümer einzuschließen, wenn mehr als einer in der Datenbank vorhanden ist.

     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 zweistufigen Ansatzes zum Generieren von Skript plus Lauf. Ein Vorteil der Skriptgenerierung besteht jedoch darin, dass Sie die Möglichkeit haben, die Gesamtheit der Ausführung zu überprüfen, bevor sie tatsächlich ausgeführt wird.

    Ich weiß, dass ich dies tun würde Wenn Sie dies mit einer Produktionsdatenbank machen, wäre ich so vorsichtig wie möglich.

    Bearbeiten Codebeispiel behoben.

    12 December 2016
    Filip Cornelissen
  •  SELECT 'DROP TABLE "' + TABLE_NAME + '"' 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_NAME LIKE '[prefix]%'
     

    Dadurch wird ein Skript generiert.

    Hinzufügen einer Klausel, um das Vorhandensein einer Tabelle vor dem Löschen zu prüfen :

     SELECT 'IF OBJECT_ID(''' +TABLE_NAME + ''') IS NOT NULL BEGIN DROP TABLE [' + TABLE_NAME + '] END;' 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_NAME LIKE '[prefix]%'
     
    06 July 2017
    CleanBoldXenph Yan
  • Dadurch werden die Tabellen in der Reihenfolge der Fremdschlüssel angezeigt, und einige der von SQL Server erstellten Tabellen müssen nicht gelöscht werden. Der Wert t.Ordinal teilt die Tabellen in Abhängigkeitsebenen auf.

     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
     
    02 December 2016
    Nhan
  • Auf Oracle XE funktioniert dies:

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

    Oder wenn Sie entfernen möchten Verwenden Sie auch die Einschränkungen und den freien Speicherplatz . Verwenden Sie Folgendes:

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

    Dadurch wird ein Bündel generiert von DROP TABLE cascade constraints PURGE -Anweisungen ...

    Verwenden Sie für VIEWS Folgendes:

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

    Bearbeiten:

    sp_MSforeachtable ist nicht dokumentiert, daher nicht geeignet für die Produktion, da das Verhalten je nach MS_SQL-Version variieren kann.

    06 March 2018
    mrosiak
  • Ich habe diesen Beitrag gesehen, als ich nach einer mysql-Anweisung gesucht habe, um alle auf @Xenph Yan basierenden WordPress-Tabellen zu löschen.

    Damit erhalten Sie die Menge der Drop-Abfragen für alle Tabellen, die mit wp _

    beginnen
    28 July 2015
    talsibonyPYK
  •  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
     
    13 September 2011
    Leon Bambrickwebworm
  • 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 TABLE_PREFIX_GOES_HERE ersetzen. mit Ihrem Präfix.

    24 March 2016
    Dakkaronalekone
  • Danke, Curt, das ist die gleiche Lösung, die ich in meiner Mitte durchgemacht habe.

    Deiner ist aber netter als meiner - er eignet sich für leichte Modifikation. Ich habe der Auswahl eine Union hinzugefügt und einige Ansichten gelöscht;)

     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
     

    Keine Sorge, Es handelt sich nicht um eine Produktionsdatenbank - dies ist nur für die einfache Bereinigung meiner Entwicklungs-Datenbank gedacht, während ich Sachen ausprobiere.

    07 August 2008
    Blorgbeard
  •  select 'DROP TABLE ' + name from sysobjects
    where type = 'U' and sysobjects.name like '%test%'
     

    - Test ist der Tabellenname

    24 June 2013
    gustavohenke