2008-08-07 16 views

Odpowiedz

120

Może być konieczne zmodyfikowanie zapytania w celu uwzględnienia właściciela, jeśli w bazie danych jest więcej niż jeden.

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 

To jest czystsze niż dwuetapowe podejście do generowania skryptu plus uruchomienie. Ale jedną z zalet generowania skryptów jest to, że daje możliwość sprawdzenia całości tego, co zostanie uruchomione, zanim faktycznie zostanie uruchomione.

Wiem, że gdybym miał to zrobić w produkcyjnej bazie danych, byłbym tak ostrożny, jak to tylko możliwe.

Edytuj Poprawiono przykład kodu.

+4

Może być konieczne kilkukrotne uruchomienie tego skryptu z powodu ograniczeń klucza obcego między tabelami głównymi i szczegółowymi. –

+7

W SQL Server 2005 musiałem zmienić ostatnie dwa wiersze na 'close cmds; deallocate cmds'. –

+0

* Ostrzeżenie *: To rozwiązanie może również usuwać tabele utworzone przez SQL Server! Poniższe rozwiązanie pozwala tego uniknąć i usuwa tabele w kolejności zależności klucza obcego. –

95
SELECT 'DROP TABLE "' + TABLE_NAME + '"' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '[prefix]%' 

Spowoduje to wygenerowanie skryptu.

Dodanie klauzuli sprawdzić istnienie tabeli przed usunięciem:

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

dodam usunąć wsporniki przy wymianie „prefiks” z przedrostkiem docelowej. – Levitikon

+6

MYSQL: SELECT concat ("DROP TABLE", TABLE_NAME, ";") jako dane z INFORMATION_SCHEMA.TABLES GDZIE TABLE_NAME LIKE "[prefiks]%" --- dla tych, którzy mnie lubili, znaleźli ten wątek – Andre

+1

Wynik zawiera również widoki – Ondra

3

Xenph Yan „s odpowiedź była znacznie czystsze niż mój, ale tutaj jest moje wszystkie takie same.

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 

Po prostu zmień tableName na znaki, które chcesz wyszukać.

0

Dzięki Curt, to jest to samo rozwiązanie, które znajdowałem w połowie drogi przez siebie.

Pozdrawiam Cię jednak lepiej niż ja - to łatwa modyfikacja. Dodałem Unii do wybierz i wymazane kilka widoków jak dobrze;)

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 

Nie martw się, to nie jest baza produkcyjna - to tylko dla łatwego sprzątania mojego dev db gdy próbuję rzeczy na zewnątrz.

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

- Test jest nazwą tabeli

+1

A co z FKs? – user3104183

+0

to faktycznie nie wykonuje niczego, wystarczy zwrócić kilka poleceń. –

14

To będzie Ci tabele w celu klucza obcego i uniknąć upuszczenia niektóre z tabel tworzonych przez SQL Server. Wartość t.Ordinal spowoduje podzielenie tabel na warstwy zależności.

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

Dzięki http://stackoverflow.com/questions/352176/sqlserver-how-to-sort-table-names-ordered-by-their-foreign-key-dependency –

+3

Szybka naprawa: TableName pojawia się kilka razy w klauzulach WHERE i powinien zostać zastąpiony przez OBJECT_NAME (so.object_id). Niezły scenariusz! – witttness

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

musiałem zrobić niewielki wyprowadzenie na odpowiedź Xenph Yan podejrzewam, bo nie miałem tabel w schemacie domyślnym.

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

Oracle XE to działa:

SELECT 'DROP TABLE "' || TABLE_NAME || '";' 
FROM USER_TABLES 
WHERE TABLE_NAME LIKE 'YOURTABLEPREFIX%' 

Albo jeśli chcesz usunąć ograniczenia i zwolnić miejsce, jak również, użyj tego:

SELECT 'DROP TABLE "' || TABLE_NAME || '" cascade constraints PURGE;' 
FROM USER_TABLES 
WHERE TABLE_NAME LIKE 'YOURTABLEPREFIX%' 

Który wygeneruje kilka oświadczeń DROP TABLE cascade constraints PURGE ...

Na VIEWS użytku to:

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

Widziałem ten post, gdy szukałem oświadczenie mysql do spadku wszystkich tabel opartych na WordPress @Xenph Yan tutaj jest to, co zrobiłem w końcu:

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

to wola daje zestaw zapytań spadku dla wszystkich tabel zaczyna wp_

2

Oto moje rozwiązanie:

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

I oczywiście musisz zastąpić TABLE_PREFIX_GOES_HERE swoim prefiksem.

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

Edit:

sp_MSforeachtable jest nieudokumentowane dlatego nie nadaje się do produkcji, bo to zachowanie może się różnić w zależności od wersji MS_SQL.

+0

Awesome one-liner! To powinno być głosowane na szczyt. – user3413723

0

W przypadku tabel tymczasowych, może chcesz spróbować

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