varios valores uso una tabla registros por mismo iniciales consulta condicion coincidencias campo buscar sql sql-server scripting dynamic-sql

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