Elimine todas las tablas cuyos nombres comienzan con una cierta cadena
-
08-06-2019 - |
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.
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]%'