Question

J'aimerais qu'un script supprime toutes les tables dont le nom commence par une chaîne donnée.Je suis sûr que cela peut être fait avec du SQL dynamique et le INFORMATION_SCHEMA les tables.

Si quelqu'un a un script ou peut en créer un rapidement, merci de le publier.

Si personne ne publie de réponse avant que je la découvre moi-même, je publierai ma solution.

Était-ce utile?

La solution

Vous devrez peut-être modifier la requête pour inclure le propriétaire s'il y en a plusieurs dans la base de données.

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

C'est plus propre que d'utiliser une approche en deux étapes consistant à générer un script et à l'exécuter.Mais l'un des avantages de la génération de scripts est qu'elle vous donne la possibilité de revoir l'intégralité de ce qui va être exécuté avant qu'il ne soit réellement exécuté.

Je sais que si je devais faire cela sur une base de données de production, je serais aussi prudent que possible.

Modifier Exemple de code corrigé.

Autres conseils

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

Cela générera un script.

Ajout d'une clause pour vérifier l'existence de la table avant de la supprimer :

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

Cela vous permettra d'obtenir les tables dans l'ordre des clés étrangères et d'éviter de supprimer certaines des tables créées par SQL Server.Le t.Ordinal La valeur découpera les tables en couches de dépendances.

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

Sur Oracle XE, cela fonctionne :

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

Ou si tu veux supprimer les contraintes et libérer de l'espace aussi, utilisez ceci :

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

Ce qui générera un tas de DROP TABLE cascade constraints PURGE déclarations...

Pour VIEWS utilisez ceci:

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

Modifier:

sp_MSforeachtable n'est pas documenté et ne convient donc pas à la production car son comportement peut varier en fonction de la version de MS_SQL.

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

J'ai vu ce message alors que je cherchais une instruction mysql pour supprimer toutes les tables WordPress basées sur @Xenph Yan, voici ce que j'ai finalement fait :

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

cela vous donnera l'ensemble des requêtes supprimées pour toutes les tables commençant par wp_

Voici ma solution :

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

Et bien sûr, vous devez remplacer TABLE_PREFIX_GOES_HERE avec votre préfixe.

Xenph YanLa réponse de était bien plus claire que la mienne mais voici quand même la mienne.

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

Change juste tableName aux caractères avec lesquels vous souhaitez effectuer une recherche.

Merci Curt, c'est le même genre de solution que j'étais à mi-chemin.

Le vôtre est cependant plus joli que le mien – il se prête facilement à des modifications.J'ai ajouté une union à la sélection et effacé certaines vues également ;)

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

Ne vous inquiétez pas, ce n'est pas une base de données de production - c'est juste pour nettoyer facilement ma base de données de développement pendant que j'essaye des choses.

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

-- Test est le nom de la table

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

J'ai dû faire une légère dérivation sur la réponse de Xenph Yan, je suppose, car j'avais des tables qui ne figuraient pas dans le schéma par défaut.

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

En cas de tables temporaires, vous voudrez peut-être essayer

SELECT 'DROP TABLE "' + t.name + '"' 
FROM tempdb.sys.tables t
WHERE t.name LIKE '[prefix]%'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top