Adları belirli bir dizeyle başlayan tüm tabloları nasıl bırakabilirim?
Bu bazı dinamik SQL ve INFORMATION_SCHEMA
tablolar ile yapılabilir düşünüyorum .
Adları belirli bir dizeyle başlayan tüm tabloları nasıl bırakabilirim?
Bu bazı dinamik SQL ve INFORMATION_SCHEMA
tablolar ile yapılabilir düşünüyorum .
Yanıtlar:
Veritabanında birden fazla varsa sahibini içerecek şekilde sorguyu değiştirmeniz gerekebilir.
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
Bu komut dosyası artı çalışma iki aşamalı bir yaklaşım kullanmak daha temiz. Ancak, komut dosyası oluşturma işleminin bir avantajı, size gerçekte çalıştırılmadan önce çalıştırılacak olanların tamamını inceleme şansı vermesidir.
Bunu bir üretim veritabanına karşı yapacak olsaydım, olabildiğince dikkatli olacağımı biliyorum.
Kod Düzenleme örneği düzeltildi.
close cmds; deallocate cmds
.
SELECT 'DROP TABLE "' + TABLE_NAME + '"'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE '[prefix]%'
Bu bir komut dosyası oluşturur.
Silmeden önce tablonun varlığını kontrol etmek için madde ekleme:
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 '\';
Bu tabloları yabancı anahtar sırayla alır ve SQL Server tarafından oluşturulan bazı tabloları düşürmekten kaçınır. t.Ordinal
Değeri bağımlılık tabakalarına tabloları dilim olacaktır.
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'de bu işe yarar:
SELECT 'DROP TABLE "' || TABLE_NAME || '";'
FROM USER_TABLES
WHERE TABLE_NAME LIKE 'YOURTABLEPREFIX%'
Veya kısıtlamaları kaldırmak ve yer açmak istiyorsanız , bunu kullanın:
SELECT 'DROP TABLE "' || TABLE_NAME || '" cascade constraints PURGE;'
FROM USER_TABLES
WHERE TABLE_NAME LIKE 'YOURTABLEPREFIX%'
Hangi DROP TABLE cascade constraints PURGE
ifadeler bir sürü oluşturacak ...
Bunu VIEWS
kullanmak için:
SELECT 'DROP VIEW "' || VIEW_NAME || '";'
FROM USER_VIEWS
WHERE VIEW_NAME LIKE 'YOURVIEWPREFIX%'
Ben @Xenph Yan dayalı tüm WordPress tabloları bırakmak mysql deyimi ararken bu yazı gördüm İşte sonunda ne yaptı:
SELECT CONCAT( 'DROP TABLE `', TABLE_NAME, '`;' ) AS query
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'wp_%'
Bu size wp_ ile başlayan tüm tablolar için bırakma sorguları seti verecektir
EXEC sp_MSforeachtable 'if PARSENAME("?",1) like ''%CertainString%'' DROP TABLE ?'
Düzenle:
sp_MSforeachtable belgesiz olduğundan üretim için uygun değildir, çünkü davranışı MS_SQL sürümüne bağlı olarak değişebilir.
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 Yan'ın cevabı benimkinden çok daha temizdi ama işte benimki aynı.
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
Aramak istediğiniz karakterleri değiştirin .
Bu benim için çalıştı.
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 tablo adıdır
Geçici tablolar olması durumunda,
SELECT 'DROP TABLE "' + t.name + '"'
FROM tempdb.sys.tables t
WHERE t.name LIKE '[prefix]%'