sql - valores - Suelta todas las tablas cuyos nombres comiencen con una cierta cadena
like varios valores sql (14)
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 sql dinámicas y INFORMATION_SCHEMA
.
Si alguien tiene un guión, o puede golpear uno rápidamente, publícalo.
Si nadie publica una respuesta antes de resolverlo yo mismo, publicaré mi solución.
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.
En Oracle XE esto funciona:
SELECT ''DROP TABLE "'' || TABLE_NAME || ''";''
FROM USER_TABLES
WHERE TABLE_NAME LIKE ''YOURTABLEPREFIX%''
O si desea eliminar las restricciones y liberar espacio también, use esto:
SELECT ''DROP TABLE "'' || TABLE_NAME || ''" cascade constraints PURGE;''
FROM USER_TABLES
WHERE TABLE_NAME LIKE ''YOURTABLEPREFIX%''
Lo cual generará un montón de DROP TABLE cascade constraints PURGE
de DROP TABLE cascade constraints PURGE
Declaraciones DROP TABLE cascade constraints PURGE
...
Para VIEWS
use esto:
SELECT ''DROP VIEW "'' || VIEW_NAME || ''";''
FROM USER_VIEWS
WHERE VIEW_NAME LIKE ''YOURVIEWPREFIX%''
En el caso de tablas temporales, es posible que desee probar
SELECT ''DROP TABLE "'' + t.name + ''"''
FROM tempdb.sys.tables t
WHERE t.name LIKE ''[prefix]%''
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.
Edit Code sample fixed.
Esto le permitirá obtener las tablas en orden de clave externa y evitar descartar algunas de las tablas creadas por SQL Server. El valor t.Ordinal
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
Gracias Curt, ese es el mismo tipo de solución que yo estaba a mitad de 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. Agregué una unión a la selección y borré algunas vistas también;)
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 solo para una fácil limpieza de mi db dev mientras trato de resolverlo.
La respuesta de fue mucho más limpia que la mía, pero aquí es lo mío.
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
Simplemente cambie tableName
por los caracteres con los que desea buscar.
Tuve que hacer una pequeña derivación en la respuesta de Xenph Yan, sospecho porque tenía tablas que no estaban en el esquema predeterminado.
SELECT ''DROP TABLE Databasename.schema.'' + TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE ''strmatch%''
Vi esta publicación cuando estaba buscando una declaración de mysql para eliminar todas las tablas de WordPress basadas en @Xenph Yan, aquí es lo que hice finalmente:
SELECT CONCAT( ''DROP TABLE `'', TABLE_NAME, ''`;'' ) AS query
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE ''wp_%''
esto le dará el conjunto de consultas para todas las tablas comienza con wp_
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
EXEC sp_MSforeachtable ''if PARSENAME("?",1) like ''''%CertainString%'''' DROP TABLE ?''
Editar:
sp_MSforeachtable no está documentado, por lo tanto, no es adecuado para la producción porque su comportamiento puede variar según la versión de MS_SQL.
SELECT ''DROP TABLE "'' + TABLE_NAME + ''"''
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE ''[prefix]%''
Esto generará una secuencia de comandos.
Agregar una cláusula para verificar la existencia de la tabla antes de eliminarla:
SELECT ''IF OBJECT_ID('''''' +TABLE_NAME + '''''') IS NOT NULL BEGIN DROP TABLE ['' + TABLE_NAME + ''] END;''
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE ''[prefix]%''
SELECT ''if object_id('''''' + TABLE_NAME + '''''') is not null begin drop table "'' + TABLE_NAME + ''" end;''
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE ''[prefix]%''
select ''DROP TABLE '' + name from sysobjects
where type = ''U'' and sysobjects.name like ''%test%''
- Prueba es el nombre de la tabla