ฉันจะวางตารางทั้งหมดที่ชื่อขึ้นต้นด้วยสตริงที่กำหนดได้อย่างไร
ฉันคิดว่าสิ่งนี้สามารถทำได้กับ SQL แบบไดนามิกและINFORMATION_SCHEMA
ตาราง
ฉันจะวางตารางทั้งหมดที่ชื่อขึ้นต้นด้วยสตริงที่กำหนดได้อย่างไร
ฉันคิดว่าสิ่งนี้สามารถทำได้กับ 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
สิ่งนี้สะอาดกว่าการใช้วิธีสร้างสคริปต์บวกสองขั้นตอน แต่ข้อดีอย่างหนึ่งของการสร้างสคริปต์ก็คือมันให้โอกาสคุณตรวจสอบทั้งหมดของสิ่งที่จะถูกเรียกใช้ก่อนที่จะทำงานจริง
ฉันรู้ว่าถ้าฉันจะทำเช่นนี้กับฐานข้อมูลการผลิตฉันจะระวังให้มากที่สุด
แก้ไขตัวอย่างรหัสแล้ว
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]%'
WHERE TABLE_NAME LIKE 'em\_%' ESCAPE '\';
สิ่งนี้จะทำให้คุณได้รับตารางในลำดับของ 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
ใน 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%'
ฉันเห็นโพสต์นี้เมื่อฉันกำลังมองหาคำสั่ง mysql เพื่อวางตาราง WordPress ทั้งหมดตาม @ Xenph Yan นี่คือสิ่งที่ฉันทำในที่สุด:
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
ด้วยคำนำหน้า
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นั้นสะอาดกว่าของฉันมาก แต่นี่ก็เหมือนกันหมด
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 @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;
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 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]%'