إسقاط جميع الجداول الأسماء التي تبدأ مع سلسلة معينة

StackOverflow https://stackoverflow.com/questions/4393

سؤال

أود سيناريو إسقاط جميع الجداول يبدأ اسمه بحرف سلسلة معينة.أنا متأكد من أن هذا يمكن القيام به مع بعض 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

هذا هو أنظف من استخدام نهج خطوتين من إنشاء البرنامج النصي بالإضافة إلى تشغيل.ولكن ميزة واحدة من السيناريو الجيل هو أنه يتيح لك فرصة لاستعراض مجمل ما سوف يتم تشغيلها من قبل أنها تعمل في الواقع.

وأنا أعلم أنه إذا كنت تنوي القيام بذلك ضد قاعدة بيانات إنتاج سأكون حذرا قدر الإمكان.

تحرير نموذج التعليمات البرمجية ثابت.

نصائح أخرى

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

على أوراكل 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 يان هنا هو ما فعلته في نهاية المطاف:

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 مع البادئة.

Xenph يان's كان الجواب الآن أنظف من الألغام ولكن هنا لي كل نفس.

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

-- اختبار هو اسم الجدول

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 يان الجواب أظن لأنه كان الجداول في المخطط الافتراضي.

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