Letakkan semua tabel yang namanya dimulai dengan string tertentu

150

Bagaimana saya bisa menjatuhkan semua tabel yang namanya dimulai dengan string yang diberikan?

Saya pikir ini bisa dilakukan dengan beberapa SQL dinamis dan INFORMATION_SCHEMAtabel.

Blorgbeard keluar
sumber

Jawaban:

151

Anda mungkin perlu memodifikasi kueri untuk menyertakan pemilik jika ada lebih dari satu dalam database.

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

Ini lebih bersih daripada menggunakan pendekatan dua langkah menghasilkan skrip plus run. Tetapi satu keuntungan dari pembuatan skrip adalah memberi Anda kesempatan untuk meninjau keseluruhan dari apa yang akan dijalankan sebelum benar-benar dijalankan.

Saya tahu bahwa jika saya akan melakukan ini terhadap database produksi, saya akan berhati-hati mungkin.

Edit contoh kode diperbaiki.

Curt Hagenlocher
sumber
5
Anda mungkin harus menjalankan skrip ini beberapa kali karena batasan kunci asing antara tabel master dan detail.
Alexander Prokofyev
7
Dalam SQL Server 2005 saya harus mengubah dua baris terakhir menjadi close cmds; deallocate cmds.
Hamish Grubijan
Peringatan : Solusi ini juga dapat menghapus tabel yang dibuat oleh SQL Server! Solusi saya di bawah ini menghindari ini dan menghapus tabel dalam urutan ketergantungan kunci asing.
Tony O'Hagan
Ini tidak berhasil untuk saya. Jawaban untuk pertanyaan ini berhasil: stackoverflow.com/questions/5116296/…
Ayushmati
115
SELECT 'DROP TABLE "' + TABLE_NAME + '"' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '[prefix]%'

Ini akan menghasilkan skrip.

Menambahkan klausa untuk memeriksa keberadaan tabel sebelum menghapus:

SELECT 'IF OBJECT_ID(''' +TABLE_NAME + ''') IS NOT NULL BEGIN DROP TABLE [' + TABLE_NAME + '] END;' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '[prefix]%'
Xenph Yan
sumber
10
Saya mungkin menambahkan untuk menghapus tanda kurung ketika mengganti "awalan" dengan awalan target Anda.
Levitikon
10
MYSQL: SELECT concat ('DROP TABLE', TABLE_NAME, ";") sebagai data DARI INFORMATION_SCHEMA.TABLES DIMANA TABLE_NAME SEPERTI '[awalan]%' --- bagi mereka yang menyukai saya menemukan utas ini
Andre
1
Hasilnya berisi juga dilihat
Ondra
1
Jangan lupa untuk melarikan diri _ jika itu bagian dari awalan Anda, mis. WHERE TABLE_NAME LIKE 'em\_%' ESCAPE '\';
EM0
3
Ini menghasilkan skrip, tetapi bagaimana seseorang menjalankan skrip?
daOnlyBG
16

Ini akan membuat Anda tabel dalam urutan kunci asing dan menghindari menjatuhkan beberapa tabel yang dibuat oleh SQL Server. The t.Ordinalnilai akan mengiris tabel ke dalam lapisan ketergantungan.

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
Tony O'Hagan
sumber
Terima kasih kepada stackoverflow.com/questions/352176/…
Tony O'Hagan
3
Perbaikan cepat: TableName muncul beberapa kali dalam klausa WHERE dan harus diganti dengan OBJECT_NAME (so.object_id). Naskah yang bagus!
Witttness
6

Pada Oracle XE ini berfungsi:

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

Atau jika Anda ingin menghapus kendala dan membebaskan ruang juga, gunakan ini:

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

Yang akan menghasilkan banyak DROP TABLE cascade constraints PURGEpernyataan ...

Untuk VIEWSmenggunakan ini:

SELECT 'DROP VIEW "' || VIEW_NAME || '";'
FROM USER_VIEWS
WHERE VIEW_NAME LIKE 'YOURVIEWPREFIX%'
Rosdi Kasim
sumber
Bekerja dengan sempurna. Memiliki 61.037 tabel kosong untuk dihapus dari db yang digunakan untuk QA. Saya menggunakan contoh pembatasan kaskade. Menghasilkan output kemudian menyalinnya semua ke dalam skrip dan menjalankannya. Butuh selamanya tetapi itu bekerja seperti pesona! Terima kasih!
tehbeardedone
5

Saya melihat posting ini ketika saya mencari pernyataan mysql untuk menghapus semua tabel WordPress berdasarkan @Xenph Yan, inilah yang akhirnya saya lakukan:

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

ini akan memberi Anda set drop query untuk semua tabel yang dimulai dengan wp_

taliboni
sumber
5

Ini solusinya:

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

Dan tentu saja Anda perlu mengganti TABLE_PREFIX_GOES_HEREdengan awalan Anda.

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

Edit:

sp_MSforeachtable tidak berdokumen sehingga tidak cocok untuk produksi karena perilakunya dapat bervariasi tergantung pada versi MS_SQL.

mrosiak
sumber
Satu liner yang luar biasa! Ini harus dipilih ke atas.
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
Cade Roux
sumber
2

Jawaban Xenph Yan jauh lebih bersih dari pada jawabanku tapi ini milikku sama saja.

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

Ubah saja tableNameke karakter yang ingin Anda cari.

FryHard
sumber
1

Ini berhasil untuk saya.

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;
ABU
sumber
0
select 'DROP TABLE ' + name from sysobjects
where type = 'U' and sysobjects.name like '%test%'

- Tes adalah nama tabel

Shashank
sumber
ini tidak benar-benar menjalankan apa pun, hanya mengembalikan banyak perintah.
Stealth Rabbi
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]%'
RGH
sumber
0

Saya harus melakukan sedikit derivasi pada jawaban Xenph Yan yang saya curigai karena saya punya tabel tidak dalam skema default.

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

Dalam hal tabel sementara, Anda mungkin ingin mencoba

SELECT 'DROP TABLE "' + t.name + '"' 
FROM tempdb.sys.tables t
WHERE t.name LIKE '[prefix]%'
João Mergulhão
sumber