名前が特定の文字列で始まるすべてのテーブルを削除します


150

名前が特定の文字列で始まるすべてのテーブルを削除するにはどうすればよいですか?

これはいくつかの動的SQLとINFORMATION_SCHEMAテーブルで実行できると思います。

回答:


151

データベースに複数ある場合は、クエリを変更して所有者を含める必要がある場合があります。

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

これは、スクリプトの生成と実行という2ステップのアプローチを使用するよりもクリーンです。しかし、スクリプト生成の1つの利点は、実際に実行される前に、実行される内容全体を確認できることです。

本番データベースに対してこれを行う場合は、できる限り注意することを知っています。

編集コードのサンプルを修正しました。


5
マスターテーブルとディテールテーブル間の外部キー制約のため、このスクリプトを数回実行する必要がある場合があります。
Alexander Prokofyev、

7
SQL Server 2005では、最後の2行をに変更する必要がありましたclose cmds; deallocate cmds
Hamish Grubijan、2011

警告:このソリューションでは、SQL Serverによって作成されたテーブルも削除される可能性があります。以下の私の解決策はこれを回避し、外部キー依存関係の順序でテーブルを削除します。
Tony O'Hagan、2015

これは私にはうまくいきませんでした。この質問に対する答えは働いた:stackoverflow.com/questions/5116296/...
Ayushmati

115
SELECT 'DROP TABLE "' + TABLE_NAME + '"' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '[prefix]%'

これによりスクリプトが生成されます。

削除する前にテーブルの存在を確認する句を追加します。

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
"prefix"をターゲットの接頭辞に置き換えるときに、括弧を追加して削除する場合があります。
Levitikon、2012年

10
MYSQL:SELECT concat( 'DROP TABLE'、TABLE_NAME、 ";")をデータFROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '[prefix]%' ---私のような人がこのスレッドを見つけた場合
Andre

1
結果にはビューも含まれます
Ondra

1
プレフィックスの一部である場合は、_をエスケープすることを忘れないでください。WHERE TABLE_NAME LIKE 'em\_%' ESCAPE '\';
EM0

3
これはスクリプトを生成しますが、スクリプトをどのように実行しますか?
daOnlyBG 2017

16

これにより、外部キーの順序でテーブルが取得され、SQL Serverによって作成されたテーブルの一部が削除されなくなります。t.Ordinal値は、依存層にテーブルをスライスします。

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
クイックフィックス:TableNameがWHERE句に数回出現するため、OBJECT_NAME(so.object_id)で置き換える必要があります。いいスクリプト!
目撃者2014

6

Oracle XEではこれが機能します。

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

または、制約削除してスペース解放する場合は、次のようにします。

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

これはたくさんのDROP TABLE cascade constraints PURGEステートメントを生成します...

以下のためにVIEWSこれを使用します。

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

完璧に働きました。QAに使用されるデータベースから削除する61,037個の空のテーブルがありました。カスケード制約の例を使用しました。出力を生成し、それをすべてスクリプトにコピーして実行しました。永遠にかかりましたが、それは魅力のように働きました!ありがとう!
tehbeardedone

5

私がmysqlステートメントを探していたときにこの投稿を見たとき、@ Xenph Yanに基づいてすべてのWordPressテーブルをドロップしました。

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

これにより、すべてのテーブルのドロップクエリのセットがwp_で始まるようになります。


5

これが私の解決策です:

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

そしてもちろん、あなたTABLE_PREFIX_GOES_HEREはあなたの接頭辞に置き換える必要があります。


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

編集:

sp_MSforeachtableはドキュメント化されていないため、MS_SQLのバージョンによって動作が異なるため、本番環境には適していません。


素晴らしいワンライナー!これはトップに投票する必要があります。
user3413723 2017

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の答えは私のものよりはるかにきれいでしたが、ここに私のものはすべて同じです。

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検索したい文字に変更するだけです。


1

これでうまくいきました。

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

-テストはテーブル名です


これは実際には何も実行せず、一連のコマンドを返すだけです。
ステルスラビ

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

デフォルトのスキーマにないテーブルがあるため、疑わしいXenph Yanの回答を少し派生させなければなりませんでした。

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

0

一時テーブルの場合は、試してみてください

SELECT 'DROP TABLE "' + t.name + '"' 
FROM tempdb.sys.tables t
WHERE t.name LIKE '[prefix]%'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.