Удалите все таблицы, имена которых начинаются с определенной строкой
Я бы хотел, чтобы скрипт отбрасывал все таблицы, имя которых начинается с заданной строки. Я уверен, что это можно сделать с помощью динамического SQL и INFORMATION_SCHEMA
таблицы.
Если у кого-то есть скрипт, или может быстро сбить его, пожалуйста, опубликуйте его.
если никто не публикует ответ, прежде чем я сам это выясню, я опубликую свое решение.
14 ответов:
вам может потребоваться изменить запрос, чтобы включить владельца, если в базе данных есть несколько.
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
Это чище, чем использование двухэтапного подхода generate script plus run. Но одно из преимуществ создания сценария заключается в том, что он дает вам возможность просмотреть все, что будет запущено, прежде чем оно будет запущено на самом деле.
Я знаю, что если бы я собирался сделать это против производственной базы данных, я был бы так же осторожен, как вероятный.
Edit исправлен пример кода.
SELECT 'DROP TABLE "' + TABLE_NAME + '"' 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]%'
это позволит вам таблицы в порядке внешнего ключа и избежать удаления некоторых таблиц, созданных SQL Server. Элемент
t.Ordinal
значение разделит таблицы на слои зависимостей.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
на Oracle XE это работает:
SELECT 'DROP TABLE "' || TABLE_NAME || '";' FROM USER_TABLES WHERE TABLE_NAME LIKE 'YOURTABLEPREFIX%'
или если вы хотите снимите ограничения и освободите место а также, используйте это:
SELECT 'DROP TABLE "' || TABLE_NAME || '" cascade constraints PURGE;' FROM USER_TABLES WHERE TABLE_NAME LIKE 'YOURTABLEPREFIX%'
, который будет генерировать кучу
DROP TABLE cascade constraints PURGE
заявления...на
VIEWS
используйте этот:SELECT 'DROP VIEW "' || VIEW_NAME || '";' FROM USER_VIEWS WHERE VIEW_NAME LIKE 'YOURVIEWPREFIX%'
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
Я видел этот пост, когда искал инструкцию mysql, чтобы удалить все таблицы WordPress на основе @Xenph Yan вот что я сделал в конце концов:
SELECT CONCAT( 'DROP TABLE `', TABLE_NAME, '`;' ) AS query FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'wp_%'
это даст вам набор запросов drop для всех таблиц начинается с wp_
EXEC sp_MSforeachtable 'if PARSENAME("?",1) like ''%CertainString%'' DROP TABLE ?'
Edit:
sp_MSforeachtable недокументирован, следовательно, не подходит для производства, потому что его поведение может варьироваться в зависимости от версии MS_SQL.
Xenph Yanответ был намного чище, чем мой, но вот мой все равно.
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
просто изменить
tableName
символы, которые вы хотите искать.
вот мое решение:
SELECT CONCAT('DROP TABLE `', TABLE_NAME,'`;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'TABLE_PREFIX_GOES_HERE%';
и, конечно, вам нужно заменить
TABLE_PREFIX_GOES_HERE
С вашей приставкой.
спасибо Курт, это то же самое решение, что я был на полпути через себя.
Ваш лучше, чем мой, хотя - он поддается легкой модификации. Я добавил Союз к select и уничтожил некоторые представления;)
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
Не волнуйтесь,это не производственная база данных - это просто для легкой очистки моей dev db, пока я пробую вещи.
select 'DROP TABLE ' + name from sysobjects where type = 'U' and sysobjects.name like '%test%'
-- Test-это имя таблицы
SELECT 'if object_id(''' + TABLE_NAME + ''') is not null begin drop table "' + TABLE_NAME + '" end;' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '[prefix]%'