2008-08-07 15 views
116

Me gustaría que un script suelte todas las tablas cuyo nombre comience con una cadena dada. Estoy seguro de que esto se puede hacer con algunas tablas dinámicas sql y INFORMATION_SCHEMA.Suelta todas las tablas cuyos nombres comiencen con una cierta cadena

Si alguien tiene un script, o puede golpear uno rápidamente, por favor publíquelo.

Si nadie publica una respuesta antes de resolverlo yo mismo, publicaré mi solución.

Respuesta

120

Es posible que deba modificar la consulta para incluir al 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 usar un enfoque en dos pasos de generar secuencia de comandos más ejecutar. Pero una de las ventajas de la generación de scripts es que le da la oportunidad de revisar la totalidad de lo que se ejecutará antes de que realmente se ejecute.

Sé que si fuera a hacer esto contra una base de datos de producción, sería lo más cuidadoso posible.

Editar Muestra de código escrita.

+4

Es posible que deba ejecutar este script varias veces debido a limitaciones de clave externa entre las tablas maestra y de detalle. –

+7

En SQL Server 2005 tuve que cambiar las dos últimas líneas para 'cerrar cmds; desasignar cmds'. –

+0

* Advertencia *: ¡Esta solución también puede eliminar tablas creadas por SQL Server! Mi solución a continuación evita esto y borra tablas en orden de dependencia de clave externa. –

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

Esto generará una secuencia de comandos.

cláusula de adición 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]%' 
+9

dicho sea de eliminar los corchetes al sustituir "prefijo" con el prefijo de su objetivo. – Levitikon

+6

MYSQL: SELECCIONE concat ('DROP TABLE', TABLE_NAME, ";") como datos FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '[prefix]%' --- para los que les gusta me encontró este hilo – Andre

+1

El resultado contiene también vistas – Ondra

3

Xenph Yan 's respuesta fue mucho más limpia que la mía, pero aquí es mío todo lo mismo.

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 

Sólo cambia tableName a los caracteres que desea buscar con.

0

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

Sin embargo, la suya es más bonita que la mía: se presta a modificaciones fáciles. He añadido una unión al selecto y aniquilado algunos puntos de vista, así;)

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 se preocupe, no es una base de datos de producción - esto es sólo para una fácil limpieza de mi dev db mientras intento cosas fuera.

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 
0
select 'DROP TABLE ' + name from sysobjects 
where type = 'U' and sysobjects.name like '%test%' 

- Test es el nombre de la tabla

+1

¿Qué hay de los FK? – user3104183

+0

esto no ejecuta nada, simplemente devuelve un montón de comandos. –

14

Esto le dará las tablas con el fin de clave externa y evitar la caída de algunas de las tablas creadas por SQL Server. El valor t.Ordinal dividirá las tablas en capas de dependencia.

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 
+0

Gracias a http://stackoverflow.com/questions/352176/sqlserver-how-to-sort-table-names-ordered-by-their-foreign-key-dependency –

+3

Solución rápida: TableName aparece algunas veces en las cláusulas WHERE y debería reemplazarse por OBJECT_NAME (so.object_id). Buena escritura! – witttness

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]%' 
0

que tenía que hacer una ligera derivación sobre la respuesta de Xenph Yan sospecho porque tenía mesas no en el esquema predeterminado.

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

en Oracle XE funciona esto:

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

O si lo desea eliminar las restricciones y liberar espacio así, utilice esto:

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

que generará un grupo de declaraciones DROP TABLE cascade constraints PURGE ...

Para VIEWS uso esto:

SELECT 'DROP VIEW "' || VIEW_NAME || '";' 
FROM USER_VIEWS 
WHERE VIEW_NAME LIKE 'YOURVIEWPREFIX%' 
4

vi este post cuando yo estaba buscando para la declaración de MySQL para dejar todas las tablas de WordPress basado en @Xenph Yan aquí es lo que hice con el tiempo:

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

esta voluntad darle el conjunto de consultas de caída para todas las tablas comienza con wp_

2

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, debe reemplazar TABLE_PREFIX_GOES_HERE con su prefijo.

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

Editar:

sp_MSforeachtable es indocumentado por lo tanto no es adecuado para la producción debido a su comportamiento puede variar dependiendo de la versión MS_SQL.

+0

Awesome one-liner! Esto debería votarse a la cima. – user3413723

0

En caso de tablas temporales, es posible que desee probar

SELECT 'DROP TABLE "' + t.name + '"' 
FROM tempdb.sys.tables t 
WHERE t.name LIKE '[prefix]%' 
Cuestiones relacionadas