質問

名前が指定された文字列で始まるすべてのテーブルを削除するスクリプトが必要です。これは動的SQLで実行できると確信しています。 INFORMATION_SCHEMA テーブル。

スクリプトを持っている人、またはすぐに作成できる人がいたら、投稿してください。

私が自分で解決する前に誰も答えを投稿しない場合は、私が解決策を投稿します。

役に立ちましたか?

解決

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

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

実稼働データベースに対してこれを実行する場合は、できる限り注意する必要があることはわかっています。

編集 コードサンプルが修正されました。

他のヒント

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

これにより、外部キーの順序でテーブルが取得され、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

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%'
EXEC sp_MSforeachtable 'if PARSENAME("?",1) like ''%CertainString%'' DROP TABLE ?'

編集:

sp_MSforeachtable は文書化されていないため、MS_SQL のバージョンによって動作が異なる可能性があるため、運用環境には適していません。

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

@Xenph Yan に基づいてすべての WordPress テーブルを削除する mysql ステートメントを探していたときにこの投稿を目にしました。 最終的に私がやったことは次のとおりです。

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

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

私の解決策は次のとおりです。

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

そしてもちろん交換する必要があります TABLE_PREFIX_GOES_HERE あなたのプレフィックスを付けてください。

ゼンフ・ヤンの答えは私のものよりはるかに明確でしたが、ここに私の答えがあります。

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 を検索したい文字にします。

ありがとう、カート、それは私が途中までやっていたのと同じ種類の解決策です。

ただし、あなたのものは私のものより優れています - 簡単に変更できます。選択にユニオンを追加し、いくつかのビューも消去しました ;)

declare @cmd varchar(4000)
declare cmds cursor for 
Select 'drop table [' + Table_Name + ']'
From    INFORMATION_SCHEMA.TABLES
Where   Table_Name like 'prefix%'
union
Select 'drop view [' + Table_Name + ']'
From    INFORMATION_SCHEMA.VIEWS
Where   Table_Name like 'prefix%'
open cmds
while 1=1
begin
    fetch cmds into @cmd
    if @@fetch_status != 0 break
    exec(@cmd)
end
close local
deallocate local

心配しないでください。これは運用データベースではありません。これは、何かを試している間に開発データベースを簡単にクリーンアップするためだけです。

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

-- Test はテーブル名です

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 の答えを少し導出する必要がありました。

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

一時テーブルの場合は、試してみるとよいでしょう

SELECT 'DROP TABLE "' + t.name + '"' 
FROM tempdb.sys.tables t
WHERE t.name LIKE '[prefix]%'
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top