Wie kann ich alle Tabellen löschen, deren Namen mit einer bestimmten Zeichenfolge beginnen?
Ich denke, dass dies mit etwas dynamischem SQL und den INFORMATION_SCHEMA
Tabellen möglich ist.
Wie kann ich alle Tabellen löschen, deren Namen mit einer bestimmten Zeichenfolge beginnen?
Ich denke, dass dies mit etwas dynamischem SQL und den INFORMATION_SCHEMA
Tabellen möglich ist.
Antworten:
Möglicherweise müssen Sie die Abfrage so ändern, dass sie den Eigentümer enthält, wenn die Datenbank mehr als eine enthält.
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 zweistufigen Ansatzes zum Generieren von Skripten plus Ausführen. Ein Vorteil der Skriptgenerierung besteht jedoch darin, dass Sie die Möglichkeit haben, die gesamte Ausführung zu überprüfen, bevor sie tatsächlich ausgeführt wird.
Ich weiß, wenn ich dies gegen eine Produktionsdatenbank tun würde, wäre ich so vorsichtig wie möglich.
Codebeispiel bearbeiten behoben.
close cmds; deallocate cmds
.
SELECT 'DROP TABLE "' + TABLE_NAME + '"'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE '[prefix]%'
Dadurch wird ein Skript generiert.
Hinzufügen einer Klausel, um das Vorhandensein einer Tabelle vor dem Löschen zu überprüfen:
SELECT 'IF OBJECT_ID(''' +TABLE_NAME + ''') IS NOT NULL BEGIN DROP TABLE [' + TABLE_NAME + '] END;'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE '[prefix]%'
WHERE TABLE_NAME LIKE 'em\_%' ESCAPE '\';
Dadurch erhalten Sie die Tabellen in der Reihenfolge der Fremdschlüssel und können einige der von SQL Server erstellten Tabellen nicht löschen. Der t.Ordinal
Wert schneidet die Tabellen in Abhängigkeitsebenen.
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
Unter Oracle XE funktioniert dies:
SELECT 'DROP TABLE "' || TABLE_NAME || '";'
FROM USER_TABLES
WHERE TABLE_NAME LIKE 'YOURTABLEPREFIX%'
Oder wenn Sie die Einschränkungen entfernen und auch Speicherplatz freigeben möchten , verwenden Sie Folgendes:
SELECT 'DROP TABLE "' || TABLE_NAME || '" cascade constraints PURGE;'
FROM USER_TABLES
WHERE TABLE_NAME LIKE 'YOURTABLEPREFIX%'
Welches wird eine Reihe von DROP TABLE cascade constraints PURGE
Aussagen generieren ...
Zur VIEWS
Verwendung:
SELECT 'DROP VIEW "' || VIEW_NAME || '";'
FROM USER_VIEWS
WHERE VIEW_NAME LIKE 'YOURVIEWPREFIX%'
Ich habe diesen Beitrag gesehen, als ich nach einer MySQL-Anweisung gesucht habe, um alle WordPress-Tabellen basierend auf @Xenph Yan zu löschen. Hier ist, was ich letztendlich getan habe:
SELECT CONCAT( 'DROP TABLE `', TABLE_NAME, '`;' ) AS query
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'wp_%'
Dadurch erhalten Sie die Drop-Abfragen für alle Tabellen, die mit wp_ beginnen
EXEC sp_MSforeachtable 'if PARSENAME("?",1) like ''%CertainString%'' DROP TABLE ?'
Bearbeiten:
sp_MSforeachtable ist nicht dokumentiert und daher nicht für die Produktion geeignet, da sein Verhalten je nach MS_SQL-Version variieren kann.
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
Xenph Yans Antwort war viel sauberer als meine, aber hier ist meine trotzdem.
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
Wechseln tableName
Sie einfach zu den Zeichen, mit denen Sie suchen möchten.
Das hat bei mir funktioniert.
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += '
DROP TABLE '
+ QUOTENAME(s.name)
+ '.' + QUOTENAME(t.name) + ';'
FROM sys.tables AS t
INNER JOIN sys.schemas AS s
ON t.[schema_id] = s.[schema_id]
WHERE t.name LIKE 'something%';
PRINT @sql;
-- EXEC sp_executesql @sql;
select 'DROP TABLE ' + name from sysobjects
where type = 'U' and sysobjects.name like '%test%'
- Test ist der Tabellenname
Bei temporären Tabellen möchten Sie es möglicherweise versuchen
SELECT 'DROP TABLE "' + t.name + '"'
FROM tempdb.sys.tables t
WHERE t.name LIKE '[prefix]%'