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.

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.


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

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


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

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_


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.


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.


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

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.


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;

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

- Tes adalah nama tabel


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

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

0

Dalam hal tabel sementara, Anda mungkin ingin mencoba

SELECT 'DROP TABLE "' + t.name + '"' 
FROM tempdb.sys.tables t
WHERE t.name LIKE '[prefix]%'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.