วางตารางทั้งหมดที่ชื่อขึ้นต้นด้วยสตริงที่แน่นอน


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

สิ่งนี้สะอาดกว่าการใช้วิธีสร้างสคริปต์บวกสองขั้นตอน แต่ข้อดีอย่างหนึ่งของการสร้างสคริปต์ก็คือมันให้โอกาสคุณตรวจสอบทั้งหมดของสิ่งที่จะถูกเรียกใช้ก่อนที่จะทำงานจริง

ฉันรู้ว่าถ้าฉันจะทำเช่นนี้กับฐานข้อมูลการผลิตฉันจะระวังให้มากที่สุด

แก้ไขตัวอย่างรหัสแล้ว


5
คุณอาจต้องเรียกใช้สคริปต์นี้หลายครั้งเนื่องจากข้อ จำกัด คีย์ต่างประเทศระหว่างตารางต้นแบบและตารางรายละเอียด
Alexander Prokofyev

7
ใน SQL Server 2005 close cmds; deallocate cmdsผมต้องเปลี่ยนสองบรรทัดสุดท้ายที่จะ
Hamish Grubijan

คำเตือน : วิธีนี้อาจลบตารางที่สร้างโดย SQL Server ด้วย! โซลูชันของฉันด้านล่างหลีกเลี่ยงสิ่งนี้และลบตารางตามลำดับการพึ่งพาคีย์ต่างประเทศ
Tony O'Hagan

สิ่งนี้ไม่ได้ผลสำหรับฉัน คำตอบสำหรับคำถามนี้ใช้งานได้: 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
ฉันอาจเพิ่มเพื่อลบวงเล็บเมื่อแทนที่ "คำนำหน้า" ด้วยคำนำหน้าเป้าหมายของคุณ
Levitikon

10
MySQL: SELECT concat ('DROP TABLE', TABLE_NAME, ";") เป็นข้อมูลจาก INFORMATION_SCHEMA.TABLES โดยที่ Table_NAME ชอบ '[คำนำหน้า]%' --- สำหรับผู้ที่ชอบฉันพบกระทู้นี้
อังเดร

1
ผลลัพธ์ยังมีมุมมอง
Ondra

1
อย่าลืมหลบหนี _ หากเป็นส่วนหนึ่งของคำนำหน้าเช่น WHERE TABLE_NAME LIKE 'em\_%' ESCAPE '\';
EM0

3
สิ่งนี้สร้างสคริปต์ แต่มีวิธีดำเนินการสคริปต์อย่างไร
daOnlyBG

16

สิ่งนี้จะทำให้คุณได้รับตารางในลำดับของ foreign key และหลีกเลี่ยงการปล่อยตารางที่สร้างโดย 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 clauses และควรแทนที่ด้วย OBJECT_NAME (so.object_id) สคริปต์ที่ดี!
witttness

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

ทำงานได้อย่างสมบูรณ์แบบ มี 61,037 ตารางว่างเปล่าที่จะลบจาก db ที่ใช้สำหรับ QA ฉันใช้ตัวอย่างข้อ จำกัด ของการเรียงซ้อน สร้างเอาต์พุตจากนั้นคัดลอกทั้งหมดลงในสคริปต์และรันมัน เอาไปตลอดกาล แต่มันก็ทำงานได้เหมือนมีเสน่ห์! ขอบคุณ!
tehbeardedone

5

ฉันเห็นโพสต์นี้เมื่อฉันกำลังมองหาคำสั่ง mysql เพื่อวางตาราง WordPress ทั้งหมดตาม @ Xenph Yan นี่คือสิ่งที่ฉันทำในที่สุด:

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


สุดยอดหนึ่งซับ! ควรได้รับการโหวตให้อยู่ด้านบน
3413723

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