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