İsimleri belirli bir dizeyle başlayan tüm tabloları bırak


150

Adları belirli bir dizeyle başlayan tüm tabloları nasıl bırakabilirim?

Bu bazı dinamik SQL ve INFORMATION_SCHEMAtablolar ile yapılabilir düşünüyorum .

Yanıtlar:


151

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.


5
Ana ve ayrıntı tabloları arasındaki yabancı anahtar kısıtlamaları nedeniyle bu komut dosyasını birkaç kez çalıştırmanız gerekebilir.
Alexander Prokofyev

7
SQL Server 2005'te son iki satırı değiştirmek zorunda kaldım close cmds; deallocate cmds.
Hamish Grubijan

Uyarı : Bu çözüm, SQL Server tarafından oluşturulan tabloları da silebilir! Aşağıdaki çözümüm bunu önler ve yabancı anahtar bağımlılık sırasına göre tabloları siler.
Tony O'Hagan

Bu benim için işe yaramadı. Bu sorunun cevabı işe yaradı: stackoverflow.com/questions/5116296/…
Ayushmati

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

10
"Öneki" hedef önekinizle değiştirirken köşeli parantezleri kaldırmayı ekleyebilirim.
Levitikon

10
MYSQL: SELECT concat ('DROP TABLE', TABLE_NAME, ";") BİLGİ_SCHEMA.TABLES'TEN NEREDE TABLE_NAME% [] öneki gibi [- önek]% --- --- bu konuyu bulmuş olanlar için
Andre

1
Sonuçta ayrıca görüntülenme sayısı
Ondra

1
Önekinizin bir parçasıysa, _'den kaçmayı unutmayın, örn. WHERE TABLE_NAME LIKE 'em\_%' ESCAPE '\';
EM0

3
Bu bir komut dosyası oluşturur, ancak komut dosyası nasıl yürütülür?
daOnlyBG

16

Bu tabloları yabancı anahtar sırayla alır ve SQL Server tarafından oluşturulan bazı tabloları düşürmekten kaçınır. t.OrdinalDeğ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


3
Hızlı düzeltme: TableName, WHERE yan tümcelerinde birkaç kez görünür ve OBJECT_NAME (so.object_id) ile değiştirilmelidir. Güzel senaryo!
witttness

6

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 PURGEifadeler bir sürü oluşturacak ...

Bunu VIEWSkullanmak için:

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

Mükemmel çalıştı. KG için kullanılan bir db'den silmek için 61.037 boş tablo vardı. Art arda gelen kısıtlamalar örneğini kullandım. Çıktıyı oluşturduktan sonra hepsini bir komut dosyasına kopyalayıp çalıştırdı. Sonsuza kadar sürdü ama bir cazibe gibi çalıştı! Teşekkürler!
tehbeardedone

5

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


5

İşte benim çözümüm:

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

Ve elbette TABLE_PREFIX_GOES_HEREön ekinizle değiştirmeniz gerekir .


5
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.


Harika bir astar! Bu en üste oylanmalıdır.
user3413723

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

2

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

tableNameAramak istediğiniz karakterleri değiştirin .


1

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;

0
select 'DROP TABLE ' + name from sysobjects
where type = 'U' and sysobjects.name like '%test%'

- Test tablo adıdır


bu aslında hiçbir şey yürütmez, sadece bir sürü komut döndürür.
Stealth Haham

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

Varsayılan şemada olmayan tablolarım olduğu için Xenph Yan'ın cevabı üzerine küçük bir türetme yapmak zorunda kaldım.

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

0

Geçici tablolar olması durumunda,

SELECT 'DROP TABLE "' + t.name + '"' 
FROM tempdb.sys.tables t
WHERE t.name LIKE '[prefix]%'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.