2008-08-07 7 views
116

Я хочу, чтобы скрипт удалял все таблицы, имя которых начинается с заданной строки. Я уверен, что это можно сделать с помощью некоторых динамических sql и таблиц INFORMATION_SCHEMA.Отбросьте все таблицы, имена которых начинаются с определенной строки

Если у кого есть сценарий, или вы можете быстро его сбить, отправьте его.

Если никто не отвечает, прежде чем я сам это выясню, я отправлю свое решение.

ответ

120

Возможно, вам потребуется изменить запрос, чтобы включить владельца, если в базе данных более одного.

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 

Это чище, чем использование двухэтапного подхода генерации скрипта плюс запуск. Но одно преимущество генерации скриптов заключается в том, что он дает вам возможность просмотреть всю полноту того, что будет запущено до его фактического запуска.

Я знаю, что если бы я собирался сделать это против производственной базы данных, я был бы предельно осторожен.

Редактировать Исходный код образца.

95
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]%' 
+9

Я мог бы добавить, чтобы удалить скобки при замене «префикс» с целевой префиксом. – Levitikon 2012-05-20 15:31:54

+6

MYSQL: SELECT concat ('DROP TABLE', TABLE_NAME, ";") в качестве данных FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '[prefix]%' --- для тех, кто любит меня, нашел эту тему – Andre 2012-11-06 00:27:01

+1

Результат также содержит просмотры – Ondra 2013-03-29 13:01:44

3

Xenph Yan «s ответ был намного чище, чем у меня, но вот мое все равно.

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 на символы, которые вы хотите искать с.

0

Спасибо, Курт, это то же самое решение, что я был на полпути через меня.

У вас лучше, чем у меня, хотя - он поддается легкой модификации. Я добавил союз на выбор и уничтожил некоторые точки зрения, а,)

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 

Не волнуйтесь, это не производство базы данных - это только для легкой очистки моего разработчика БД в то время как я пытаюсь материал вне.

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

- Тест имя таблицы

14

Это поможет вам таблицы в иностранном порядке ключа и не уронить некоторые из таблиц, созданных 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 
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

я должен был сделать небольшой вывод на ответ Xenph Янь я подозреваю, потому что я имел таблицы не в схеме по умолчанию.

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

В 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%' 

Который будет генерировать a bunch of DROP TABLE cascade constraints PURGE заявления ...

Для VIEWS использования этого:

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

Я видел этот пост, когда я искал тузд заявления отказаться от всех таблиц WordPress на основе @Xenph Ян вот то, что я в конце концов:

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

это будет дать вам набор запросов капельных для всех таблиц начинается с wp_

2

Вот мое решение:

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

И, конечно же, вы должны заменить TABLE_PREFIX_GOES_HERE на свой префикс.

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

Редактировать:

sp_MSforeachtable это без документов, следовательно, не подходит для производства, потому что это поведение может варьироваться в зависимости от версии MS_SQL.

0

В случае временных таблиц, вы можете попробовать

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