Solte todas as tabelas cujos nomes começam com uma determinada seqüência

votos
120

Eu gostaria de um script para descartar todas as tabelas cujo nome começa com uma determinada string. Tenho certeza que isso pode ser feito com alguns sql dinâmico e as INFORMATION_SCHEMAtabelas.

Se alguém tiver um script, ou pode bater um rapidamente, por favor poste.

Se ninguém publica uma resposta antes de eu descobrir sozinho, vou postar a minha solução.

Publicado 07/08/2008 em 05:41
fonte usuário
Em outras línguas...                            


15 respostas

votos
123

Você pode precisar modificar a consulta para incluir o proprietário se há mais de um no banco de dados.

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

Esta é mais limpo do que usar uma abordagem de duas etapas de gerar script de mais prazo. Mas uma vantagem da geração de script é que ele dá-lhe a oportunidade de rever a totalidade do que está acontecendo para ser executado antes que seja realmente executado.

Eu sei que se eu fosse fazer isso contra um banco de dados de produção, eu seria tão cuidadoso quanto possível.

Editar Exemplo de código fixo.

Respondeu 07/08/2008 em 05:53
fonte usuário

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

Isso irá gerar um script.

Adicionando cláusula para verificar existência de tabela antes de excluir:

SELECT 'IF OBJECT_ID(''' +TABLE_NAME + ''') IS NOT NULL BEGIN DROP TABLE [' + TABLE_NAME + '] END;' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '[prefix]%'
Respondeu 07/08/2008 em 05:44
fonte usuário

votos
14

Isso vai te dar as mesas, a fim de chave estrangeira e evitar deixar cair algumas das tabelas criadas pelo SQL Server. O t.Ordinalvalor vai cortar os quadros em camadas de dependência.

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
Respondeu 10/02/2014 em 09:04
fonte usuário

votos
4
EXEC sp_MSforeachtable 'if PARSENAME("?",1) like ''%CertainString%'' DROP TABLE ?'

Editar:

sp_MSforeachtable não é documentado, por conseguinte, não é adequado para a produção, porque é comportamento pode variar, dependendo da versão MS_SQL.

Respondeu 08/06/2016 em 16:33
fonte usuário

votos
4

Eu vi este post quando eu estava à procura de instrução do mysql para soltar todas as tabelas WordPress com base em @Xenph Yan aqui é o que eu fiz, eventualmente:

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

isto lhe dará o conjunto de consultas de queda para todas as tabelas começa com wp_

Respondeu 28/07/2015 em 06:14
fonte usuário

votos
4

No Oracle XE isso funciona:

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

Ou se você quiser remover as restrições e liberar espaço , bem como, utilizar este:

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

O que irá gerar um monte de DROP TABLE cascade constraints PURGEdeclarações ...

Para VIEWSuso isso:

SELECT 'DROP VIEW "' || VIEW_NAME || '";'
FROM USER_VIEWS
WHERE VIEW_NAME LIKE 'YOURVIEWPREFIX%'
Respondeu 21/05/2015 em 11:31
fonte usuário

votos
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
Respondeu 10/10/2008 em 03:31
fonte usuário

votos
3

Xenph Yan resposta 's era muito mais limpo do que o meu, mas aqui é meu tudo a mesma coisa.

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

Basta alterar tableNameos caracteres que você deseja pesquisar com.

Respondeu 07/08/2008 em 05:53
fonte usuário

votos
2

Aqui está a minha solução:

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

E, claro, você precisa substituir TABLE_PREFIX_GOES_HEREcom o seu prefixo.

Respondeu 24/03/2016 em 12:19
fonte usuário

votos
0

Isso funcionou para mim.

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += '
DROP TABLE ' 
    + QUOTENAME(s.name)
    + '.' + QUOTENAME(t.name) + ';'
    FROM sys.tables AS t
    INNER JOIN sys.schemas AS s
    ON t.[schema_id] = s.[schema_id] 
    WHERE t.name LIKE 'something%';

PRINT @sql;
-- EXEC sp_executesql @sql;
Respondeu 15/08/2019 em 17:47
fonte usuário

votos
0

Em caso de tabelas temporárias, você pode querer tentar

SELECT 'DROP TABLE "' + t.name + '"' 
FROM tempdb.sys.tables t
WHERE t.name LIKE '[prefix]%'
Respondeu 06/09/2016 em 11:21
fonte usuário

votos
0

Eu tive que fazer uma ligeira derivação da resposta do Xenph Yan eu suspeito porque eu tinha mesas não no esquema padrão.

SELECT 'DROP TABLE Databasename.schema.' + TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'strmatch%'
Respondeu 16/02/2015 em 01:05
fonte usuário

votos
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]%'
Respondeu 01/08/2014 em 15:16
fonte usuário

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

- Teste é o nome da tabela

Respondeu 24/06/2013 em 18:42
fonte usuário

votos
0

Graças Curt, que é o mesmo tipo de solução que eu estava a meio caminho através de mim.

O seu é mais agradável do que a minha embora - presta-se a modificação fácil. Eu adicionei uma união para o seleto e eliminou alguns pontos de vista bem;)

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

Não se preocupe, não é um banco de dados de produção - isto é apenas para facilitar a limpeza do meu dev db enquanto eu tento material para fora.

Respondeu 07/08/2008 em 06:00
fonte usuário

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