168

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

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

4

15 に答える 15

167

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

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つは、実際に実行される前に、実行される内容全体を確認できることです。

これを本番データベースに対して行う場合は、可能な限り注意する必要があることを私は知っています。

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

于 2008-08-07T04:53:29.857 に答える
130
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]%'
于 2008-08-07T04:44:48.283 に答える
8

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%'
于 2015-05-21T11:31:56.173 に答える
7

これが私の解決策です:

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

TABLE_PREFIX_GOES_HEREそしてもちろん、プレフィックスに置き換える必要があります。

于 2016-03-24T12:19:15.197 に答える
5

@Xenph Yan に基づいてすべての WordPress テーブルを削除する mysql ステートメントを探していたときに、この投稿を見ました。

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

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

于 2015-07-28T06:14:25.763 に答える
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
于 2008-10-10T02:31:42.060 に答える
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検索したい文字に変更するだけです。

于 2008-08-07T04:53:09.483 に答える
0

デフォルトのスキーマにないテーブルを持っていたので、Xenph Yan の答えを少し派生させなければなりませんでした。

SELECT 'DROP TABLE Databasename.schema.' + TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'strmatch%'
于 2015-02-16T01:05:02.273 に答える
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]%'
于 2014-08-01T14:16:29.303 に答える
0

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

SELECT 'DROP TABLE "' + t.name + '"' 
FROM tempdb.sys.tables t
WHERE t.name LIKE '[prefix]%'
于 2016-09-06T11:21:10.363 に答える