Pregunta

Me gustaría una secuencia de comandos para soltar todas las tablas cuyo nombre comienza con una cadena dada.Estoy seguro de que esto se puede hacer con algunos de sql dinámico, y la INFORMATION_SCHEMA tablas.

Si alguien tiene un script, o puede golpear una rápidamente, por favor, publicarlo.

Si nadie publica una respuesta antes de que yo averiguarlo yo mismo, voy a publicar mi solución.

¿Fue útil?

Solución

Puede que necesite modificar la consulta para incluir el propietario si hay más de uno en la base de datos.

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

Esto es más limpio que el uso de un enfoque de dos pasos de generar un script, además de ejecutar.Pero una de las ventajas de la generación de secuencias de comandos es que te da la oportunidad de revisar la totalidad de lo que se va a ejecutar antes de que realmente se ejecuta.

Yo sé que si yo iba a hacer esto en contra de una base de datos de producción, me gustaría ser lo más cuidadoso posible.

Editar Ejemplo de código fijo.

Otros consejos

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

Esto va a generar una secuencia de comandos.

La adición de la cláusula para comprobar la existencia de la tabla antes de eliminar:

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

De esta manera se consigue que las tablas en la clave externa de la orden y evitar que se eliminen algunas de las tablas creadas por SQL Server.El t.Ordinal valor a cortar las tablas, en la dependencia de las capas.

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

En Oracle XE esto funciona:

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

O si desea eliminar las limitaciones y liberar espacio así, el uso de este:

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

Que va a generar un montón de DROP TABLE cascade constraints PURGE declaraciones...

Para VIEWS el uso de este:

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

Editar:

sp_MSforeachtable es indocumentados por lo tanto no es adecuado para la producción porque es el comportamiento puede variar dependiendo de MS_SQL versión.

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

Vi este post cuando yo estaba buscando mysql instrucción para colocar todas las tablas de WordPress basado en @Xenph Yan aquí es lo que me hizo finalmente:

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

esto le dará el conjunto de la caída de consultas para todas las tablas comienza wp_

Aquí está mi solución:

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

Y, por supuesto, usted necesita para reemplazar TABLE_PREFIX_GOES_HERE con su prefijo.

Xenph Yan's respuesta fue mucho más limpia que el mío, pero aquí está: mía es toda la misma.

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

Acaba de cambiar tableName a los caracteres que desea realizar la búsqueda.

Gracias Curt, que el mismo tipo de solución que yo estaba a mitad de camino a través de mí.

El tuyo es más bonito que el mío, aunque se presta a una fácil modificación.He añadido un sindicato para la selección y borró algunos puntos de vista ;)

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

No te preocupes, no es una base de datos de producción - esto es sólo para que se pueda limpiar fácilmente de mi dev db, mientras que yo trato de las cosas.

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

-- Test es el nombre de la tabla

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

Tuve que hacer un ligero derivación en Xenph Yan la respuesta sospecho que porque me había tablas, no en el esquema predeterminado.

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

En el caso de las tablas temporales, es posible que desee probar

SELECT 'DROP TABLE "' + t.name + '"' 
FROM tempdb.sys.tables t
WHERE t.name LIKE '[prefix]%'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top