Löschen Sie alle Tabellen, deren Namen beginnen mit einem bestimmten string
-
08-06-2019 - |
Frage
Ich möchte ein Skript löschen Sie alle Tabellen, deren name beginnt mit einem gegebenen string.Ich bin sicher, dass dies getan werden kann, mit einigen dynamischen sql und der INFORMATION_SCHEMA
Tabellen.
Wenn jemand ein script oder kann knock one up schnell, bitte posten Sie es.
Wenn niemand Bucht eine Antwort, bevor ich es herausfinden, ich selbst, ich poste meine Lösung.
Lösung
Möglicherweise müssen Sie die Abfrage ändern, um den Eigentümer, wenn es mehr als einen in der Datenbank.
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
Dies ist sauberer als die Verwendung eines zwei-Schritt-Ansatz, der ein Skript generieren, plus ausführen.Aber ein Vorteil des scripts ist, dass es Ihnen die Möglichkeit gibt, zu überprüfen Sie die Gesamtheit, was Los ist, ausgeführt zu werden, bevor es tatsächlich ausgeführt wird.
Ich weiß, dass wenn ich im Begriff waren zu tun, diese gegen eine Produktionsdatenbank, würde ich so vorsichtig wie möglich.
Bearbeiten Codebeispiel behoben.
Andere Tipps
SELECT 'DROP TABLE "' + TABLE_NAME + '"'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE '[prefix]%'
Dies wird ein Skript generieren.
Hinzufügen-Klausel zu überprüfen, die Existenz der Tabelle vor dem löschen:
SELECT 'IF OBJECT_ID(''' +TABLE_NAME + ''') IS NOT NULL BEGIN DROP TABLE [' + TABLE_NAME + '] END;'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE '[prefix]%'
Diese erhalten Sie die Tabellen in fremden Schlüssel um und vermeiden Sie, fallen einige der Tabellen von SQL Server erstellt.Die t.Ordinal
Wert wird schneiden Sie die Tische in Abhängigkeit Schichten.
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
Auf Oracle XE das funktioniert:
SELECT 'DROP TABLE "' || TABLE_NAME || '";'
FROM USER_TABLES
WHERE TABLE_NAME LIKE 'YOURTABLEPREFIX%'
Oder wenn Sie möchten entfernen Sie die Einschränkungen und Speicherplatz wie gut, verwenden Sie diese:
SELECT 'DROP TABLE "' || TABLE_NAME || '" cascade constraints PURGE;'
FROM USER_TABLES
WHERE TABLE_NAME LIKE 'YOURTABLEPREFIX%'
Die erzeugen Sie eine Reihe von DROP TABLE cascade constraints PURGE
Anweisungen...
Für VIEWS
benutzen Sie diese:
SELECT 'DROP VIEW "' || VIEW_NAME || '";'
FROM USER_VIEWS
WHERE VIEW_NAME LIKE 'YOURVIEWPREFIX%'
EXEC sp_MSforeachtable 'if PARSENAME("?",1) like ''%CertainString%'' DROP TABLE ?'
Edit:
sp_MSforeachtable ist nicht dokumentiert, daher nicht geeignet für die Produktion, weil es das Verhalten kann je nach MS_SQL version.
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
Ich sah diesen Beitrag, wenn ich war auf der Suche für die mysql-Anweisung zum löschen aller WordPress-Tabellen basierend auf dem @Xenph Yan-hier ist das, was ich schließlich:
SELECT CONCAT( 'DROP TABLE `', TABLE_NAME, '`;' ) AS query
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'wp_%'
dies wird Ihnen die Menge der Tropfen, die Abfragen für alle Tabellen beginnt mit wp_
Hier ist meine Lösung:
SELECT CONCAT('DROP TABLE `', TABLE_NAME,'`;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'TABLE_PREFIX_GOES_HERE%';
Und natürlich müssen Sie ersetzen TABLE_PREFIX_GOES_HERE
mit Ihr Präfix.
Xenph Yan's Antwort war viel sauberer als meine, aber hier ist mir alles gleich.
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
Ändern Sie einfach tableName
zu den Zeichen, die Sie suchen möchten, mit.
Dank Curt, das ist die gleiche Art von Lösung, die ich war auf halbem Weg durch mich.
Deiner ist schöner als meine, obwohl es eignet sich für einfache änderung.Ich habe eine union, um die wählen Sie und wischte sich einige Ansichten, wie gut ;)
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
Mach dir keine sorgen, es ist nicht eine Produktions-Datenbank - dies ist nur für leicht sauber-up von meinem dev-db, während ich versuche, Sachen heraus.
select 'DROP TABLE ' + name from sysobjects
where type = 'U' and sysobjects.name like '%test%'
-- Test-ist der name der Tabelle
SELECT 'if object_id(''' + TABLE_NAME + ''') is not null begin drop table "' + TABLE_NAME + '" end;'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE '[prefix]%'
Ich musste eine leichte Ableitung auf Xenph Yan Antwort ich vermute, da hatte ich die Tabellen nicht in der Standard-schema.
SELECT 'DROP TABLE Databasename.schema.' + TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'strmatch%'
In Fall von temporäre Tabellen, möchten Sie vielleicht, um zu versuchen
SELECT 'DROP TABLE "' + t.name + '"'
FROM tempdb.sys.tables t
WHERE t.name LIKE '[prefix]%'